Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -142,9 +142,9 @@ private static async Task<int> ExecuteAsync(
}
}

await activity.FailAllAsync(errorTree);
await activity.FailAllAsync(errorTree, "Client version was rejected.");

throw new ExitException("Client publish failed.");
throw new ExitException("Client version was rejected.");

case IClientVersionPublishSuccess:
activity.Success($"Published new client version '{tag.EscapeMarkup()}' to stage '{stage.EscapeMarkup()}'.");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -124,12 +124,12 @@ private static async Task<int> ExecuteAsync(
}
}

await activity.FailAllAsync(errorTree);
await activity.FailAllAsync(errorTree, "Client failed validation.");

throw new ExitException("Client validation failed.");
throw new ExitException("Client failed validation.");

case IClientVersionValidationSuccess:
activity.Success($"Validated client against stage '{stage.EscapeMarkup()}'.");
activity.Success("Client passed validation.");

return ExitCodes.Success;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -275,7 +275,7 @@ async Task<Stream> ComposeAsync(
}
else
{
await composeActivity.FailAllAsync();
await composeActivity.FailAllAsync(message: "Fusion configuration could not be composed.");

console.WriteLine();
console.WriteLine("## Composition log");
Expand Down Expand Up @@ -367,14 +367,14 @@ await FusionPublishHelpers.ClaimDeploymentSlotAsync(

if (isValidArchive)
{
validationActivity.Success("Validated configuration.");
validationActivity.Success("Fusion configuration passed validation.");
}
else if (!force)
{
// Write directly instead of throwing so the release-slot fallback
// in the outer catch is not triggered — the publish hasn't actually
// reserved any remote state that needs tearing down here.
console.Error.WriteErrorLine("Fusion configuration validation failed.");
console.Error.WriteErrorLine("Fusion configuration failed validation.");
return ExitCodes.Error;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,9 +104,9 @@ public static async Task<string> RequestDeploymentSlotAsync(
}
}

await activity.FailAllAsync(errorTree);
await activity.FailAllAsync(errorTree, "Fusion configuration version was rejected.");

throw new ExitException("Your request has failed.");
throw new ExitException("Fusion configuration version was rejected.");

case IFusionConfigurationPublishingSuccess:
await subscriptionCancellation.CancelAsync();
Expand Down Expand Up @@ -227,8 +227,8 @@ public static async Task<bool> UploadFusionConfigurationAsync(
}
}

await activity.FailAllAsync(publishErrorTree);
throw new ExitException("Failed to publish the new configuration.");
await activity.FailAllAsync(publishErrorTree, "Fusion configuration version was rejected.");
throw new ExitException("Fusion configuration version was rejected.");

case IFusionConfigurationPublishingSuccess:
committed = true;
Expand Down Expand Up @@ -378,7 +378,7 @@ public static async Task<bool> ValidateFusionConfigurationAsync(
}
}

activity.Fail(errorTree);
activity.Fail(errorTree, "Fusion configuration failed validation.");

return false;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,7 @@ async Task<int> ValidateWithSourceSchemaFiles()
}
else
{
await composeActivity.FailAllAsync();
await composeActivity.FailAllAsync(message: "Fusion configuration could not be composed.");

console.WriteLine();
console.WriteLine("## Composition log");
Expand Down Expand Up @@ -218,7 +218,7 @@ async Task<int> ValidateAsync(INitroConsoleActivity activity, Stream archiveStre

try
{
var isValid = await SchemaHelpers.ValidateSchemaAsync(
var validationResult = await SchemaHelpers.ValidateSchemaAsync(
activity,
console,
schemasClient,
Expand All @@ -228,11 +228,15 @@ async Task<int> ValidateAsync(INitroConsoleActivity activity, Stream archiveStre
source: null,
ct);

if (!isValid)
if (validationResult is SchemaValidationResult.Failed failed)
{
throw new ExitException("Schema validation failed.");
activity.Fail(failed.Details, "Fusion configuration failed validation.");

throw new ExitException("Fusion configuration failed validation.");
}

activity.Success("Fusion configuration passed validation.");

return ExitCodes.Success;
}
finally
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,10 +63,10 @@ await FusionConfigurationPublishingState.GetRequestId(fileSystem, cancellationTo

if (!isValidArchive)
{
throw new ExitException("Fusion configuration validation failed.");
throw new ExitException("Fusion configuration failed validation.");
}

activity.Success("Validated configuration.");
activity.Success("Fusion configuration passed validation.");

return ExitCodes.Success;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -143,9 +143,9 @@ private static async Task<int> ExecuteAsync(
}
}

await activity.FailAllAsync(errorTree);
await activity.FailAllAsync(errorTree, "MCP feature collection version was rejected.");

throw new ExitException("MCP feature collection publish failed.");
throw new ExitException("MCP feature collection version was rejected.");

case IMcpFeatureCollectionVersionPublishSuccess:
activity.Success($"Published new version '{tag.EscapeMarkup()}' of MCP feature collection '{mcpFeatureCollectionId.EscapeMarkup()}' to stage '{stage.EscapeMarkup()}'.");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -139,12 +139,12 @@ await McpFeatureCollectionHelpers.BuildMcpFeatureCollectionArchive(
}
}

await activity.FailAllAsync(errorTree);
await activity.FailAllAsync(errorTree, "MCP feature collection failed validation.");

throw new ExitException("MCP feature collection validation failed.");
throw new ExitException("MCP feature collection failed validation.");

case IMcpFeatureCollectionVersionValidationSuccess:
activity.Success($"Validated MCP feature collection against stage '{stage.EscapeMarkup()}'.");
activity.Success("MCP feature collection passed validation.");
return ExitCodes.Success;

case IOperationInProgress:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -142,9 +142,9 @@ private static async Task<int> ExecuteAsync(
}
}

await activity.FailAllAsync(errorTree);
await activity.FailAllAsync(errorTree, "OpenAPI collection version was rejected.");

throw new ExitException("OpenAPI collection publish failed.");
throw new ExitException("OpenAPI collection version was rejected.");

case IOpenApiCollectionVersionPublishSuccess:
activity.Success($"Published new version '{tag.EscapeMarkup()}' of OpenAPI collection '{openApiCollectionId.EscapeMarkup()}' to stage '{stage.EscapeMarkup()}'.");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -131,12 +131,12 @@ await OpenApiCollectionHelpers.BuildOpenApiCollectionArchive(
}
}

await activity.FailAllAsync(errorTree);
await activity.FailAllAsync(errorTree, "OpenAPI collection failed validation.");

throw new ExitException("OpenAPI collection validation failed.");
throw new ExitException("OpenAPI collection failed validation.");

case IOpenApiCollectionVersionValidationSuccess:
activity.Success($"Validated OpenAPI collection against stage '{stage.EscapeMarkup()}'.");
activity.Success("OpenAPI collection passed validation.");
return ExitCodes.Success;

case IOperationInProgress:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -164,9 +164,9 @@ private static async Task<int> ExecuteAsync(
}
}

await activity.FailAllAsync(errorTree);
await activity.FailAllAsync(errorTree, "Schema version was rejected.");

throw new ExitException("Schema publish failed.");
throw new ExitException("Schema version was rejected.");

case ISchemaVersionPublishSuccess:
activity.Success($"Published new schema version '{tag.EscapeMarkup()}' to stage '{stage.EscapeMarkup()}'.");
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
using ChilliCream.Nitro.Client;
using ChilliCream.Nitro.Client.Schemas;
using ChilliCream.Nitro.CommandLine.Helpers;
using Spectre.Console.Rendering;

namespace ChilliCream.Nitro.CommandLine.Commands.Schemas;

internal static class SchemaHelpers
{
public static async Task<bool> ValidateSchemaAsync(
public static async Task<SchemaValidationResult> ValidateSchemaAsync(
INitroConsoleActivity activity,
INitroConsole console,
ISchemasClient client,
Expand All @@ -25,8 +26,6 @@ public static async Task<bool> ValidateSchemaAsync(

if (result.Errors?.Count > 0)
{
await activity.FailAllAsync();

foreach (var error in result.Errors)
{
var errorMessage = error switch
Expand Down Expand Up @@ -96,14 +95,10 @@ public static async Task<bool> ValidateSchemaAsync(
}
}

await activity.FailAllAsync(errorTree);

return false;
return new SchemaValidationResult.Failed(errorTree);

case ISchemaVersionValidationSuccess:
activity.Success("Schema validation successful.");

return true;
return SchemaValidationResult.Success.Instance;

case IOperationInProgress:
case IValidationInProgress:
Expand All @@ -116,6 +111,20 @@ public static async Task<bool> ValidateSchemaAsync(
}
}

return false;
throw new ExitException(Messages.UnknownServerResponse);
}
}

internal abstract record SchemaValidationResult
{
public sealed record Success : SchemaValidationResult
{
public static readonly Success Instance = new();

private Success()
{
}
}

public sealed record Failed(IRenderable Details) : SchemaValidationResult;
}
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ private static async Task<int> ExecuteAsync(

await using var stream = fileSystem.OpenReadStream(schemaFilePath);

var isValid = await SchemaHelpers.ValidateSchemaAsync(
var validationResult = await SchemaHelpers.ValidateSchemaAsync(
activity,
console,
client,
Expand All @@ -74,11 +74,15 @@ private static async Task<int> ExecuteAsync(
source,
ct);

if (!isValid)
if (validationResult is SchemaValidationResult.Failed failed)
{
throw new ExitException("Schema validation failed.");
activity.Fail(failed.Details, "Schema failed validation.");

throw new ExitException("Schema failed validation.");
}

activity.Success("Schema passed validation.");

return ExitCodes.Success;
}
}
4 changes: 2 additions & 2 deletions src/Nitro/CommandLine/src/CommandLine/Messages.cs
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,9 @@ public static string UnexpectedMutationError(IError error)

public const string Validating = "Validating...";

public const string ValidationPassed = "Validation successful.";
public const string ValidationPassed = "Passed validation.";

public const string ValidationFailed = "Validation failed.";
public const string ValidationFailed = "Failed validation.";

public const string RequestReadyForProcessing =
"Your request is ready for processing.";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@ internal interface INitroConsoleActivity : IAsyncDisposable

void Fail();

void Fail(IRenderable details);
void Fail(IRenderable details, string? message = null);

ValueTask FailAllAsync(IRenderable? details = null);
ValueTask FailAllAsync(IRenderable? details = null, string? message = null);

INitroConsoleActivity StartChildActivity(string title, string failureMessage);
}
Original file line number Diff line number Diff line change
Expand Up @@ -70,14 +70,14 @@ public void Fail()
Fail(_failureMessage);
}

public void Fail(IRenderable details)
public void Fail(IRenderable details, string? message = null)
{
Complete(_failureMessage, ActivityState.Failed, details);
Complete(message ?? _failureMessage, ActivityState.Failed, details);
}

public async ValueTask FailAllAsync(IRenderable? details = null)
public async ValueTask FailAllAsync(IRenderable? details = null, string? message = null)
{
Complete(_failureMessage, ActivityState.Failed, details);
Complete(message ?? _failureMessage, ActivityState.Failed, details);

if (_parent is not null)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -269,13 +269,13 @@ public async Task BreakingChanges_ReturnsError()
"""
Publishing new version 'v1' of client 'client-1' to stage 'dev'
├── Publication request created. (ID: request-1)
└── ✕ Failed to publish a new client version.
└── ✕ Client version was rejected.
└── Operation '6D12E4A815C50C504695E548EAF680BC8F337AC87E763E5689C685522A01BC59' (Deployed tags: 1.0.0)
└── foo (10:10)
""");
result.StdErr.MatchInlineSnapshot(
"""
Client publish failed.
Client version was rejected.
""");
Assert.Equal(1, result.ExitCode);
}
Expand Down Expand Up @@ -337,7 +337,7 @@ public async Task WaitForApproval_BreakingChanges_Approved_ReturnsSuccess()
"""
Publishing new version 'v1' of client 'client-1' to stage 'dev'
├── Publication request created. (ID: request-1)
├── ! Validation failed.
├── ! Failed validation.
│ └── Operation '6D12E4A815C50C504695E548EAF680BC8F337AC87E763E5689C685522A01BC59' (Deployed tags: 1.0.0)
│ └── foo (10:10)
├── ⏳ Waiting for approval. Approve in Nitro to continue.
Expand Down Expand Up @@ -370,17 +370,17 @@ public async Task WaitForApproval_BreakingChanges_NotApproved_ReturnsError()
// assert
result.StdErr.MatchInlineSnapshot(
"""
Client publish failed.
Client version was rejected.
""");
result.StdOut.MatchInlineSnapshot(
"""
Publishing new version 'v1' of client 'client-1' to stage 'dev'
├── Publication request created. (ID: request-1)
├── ! Validation failed.
├── ! Failed validation.
│ └── Operation '6D12E4A815C50C504695E548EAF680BC8F337AC87E763E5689C685522A01BC59' (Deployed tags: 1.0.0)
│ └── foo (10:10)
├── ⏳ Waiting for approval. Approve in Nitro to continue.
└── ✕ Failed to publish a new client version.
└── ✕ Client version was rejected.
""");
Assert.Equal(1, result.ExitCode);
}
Expand Down
Loading
Loading