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 @@ -193,8 +193,8 @@ private static async Task<int> ExecuteAsync(

child.Update(
Messages.ValidationFailed,
approvalErrorTree,
ActivityUpdateKind.Warning);
ActivityUpdateKind.Warning,
approvalErrorTree);
}

child.Update(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -276,7 +276,7 @@ public static async Task<bool> UploadFusionConfigurationAsync(
}
}

activity.Update(Messages.ValidationFailed, errorTree, ActivityUpdateKind.Warning);
activity.Update(Messages.ValidationFailed, ActivityUpdateKind.Warning, errorTree);
}

activity.Update(Messages.WaitingForApproval, ActivityUpdateKind.Waiting);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,7 @@ private static async Task<int> ExecuteAsync(
}
}

child.Update(Messages.ValidationFailed, approvalErrorTree, ActivityUpdateKind.Warning);
child.Update(Messages.ValidationFailed, ActivityUpdateKind.Warning, approvalErrorTree);
}

child.Update(Messages.WaitingForApproval, ActivityUpdateKind.Waiting);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,7 @@ private static async Task<int> ExecuteAsync(
}
}

child.Update(Messages.ValidationFailed, approvalErrorTree, ActivityUpdateKind.Warning);
child.Update(Messages.ValidationFailed, ActivityUpdateKind.Warning, approvalErrorTree);
}

child.Update(Messages.WaitingForApproval, ActivityUpdateKind.Waiting);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -231,8 +231,8 @@ private static async Task<int> ExecuteAsync(

child.Update(
Messages.ValidationFailed,
deploymentErrorTree,
ActivityUpdateKind.Warning);
ActivityUpdateKind.Warning,
deploymentErrorTree);
}

child.Update(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,16 @@ public static string AsSyntax(this string str)
return $"[bold]{str.EscapeMarkup()}[/]";
}

public static string AsError(this string str)
{
return $"[red]{str.EscapeMarkup()}[/]";
}

public static string AsWarning(this string str)
{
return $"[yellow]{str.EscapeMarkup()}[/]";
}

public static string AsDescription(this string str)
{
return $"[italic dim]{str.EscapeMarkup()}[/]";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ public static IHasTreeNodes AddErrorMessage(
this IHasTreeNodes node,
string message)
{
return node.AddNode($"[red]{message.EscapeMarkup()}[/]");
return node.AddNode(message.EscapeMarkup().AsError());
Comment thread
tobias-tengler marked this conversation as resolved.
}

public static IHasTreeNodes AddSchemaVersionChangeViolations(
Expand All @@ -32,11 +32,11 @@ public static IHasTreeNodes AddGraphQLSchemaErrors(
this IHasTreeNodes node,
IInvalidGraphQLSchemaError error)
{
var schemaErrorsNode = node.AddNode("Invalid GraphQL schema");
var schemaErrorsNode = node.AddErrorMessage("Invalid GraphQL schema");

foreach (var query in error.Errors)
foreach (var schemaError in error.Errors)
{
schemaErrorsNode.AddNode($"[red]{query.Message.EscapeMarkup()}[/] [grey]{query.Code}[/]");
schemaErrorsNode.AddNode($"{schemaError.Message.AsError()} [dim]{schemaError.Code}[/]");
}

return node;
Expand All @@ -47,27 +47,9 @@ public static IHasTreeNodes AddPersistedQueryValidationErrorsWithClients(
IPersistedQueryValidationError error)
{
var client = error.Client;
var clientNode = node.AddNode($"Client '{client?.Name.EscapeMarkup()}' (ID: {client?.Id})");
var clientNode = node.AddNode($"Client '{client?.Name.EscapeMarkup()}' [dim](ID: {client?.Id})[/]");

foreach (var operation in error.Queries)
{
var publishingInfo = operation.DeployedTags.Count > 0
? $" (Deployed tags: {string.Join(",", operation.DeployedTags)})"
: "";

var operationNode = clientNode.AddNode($"Operation '{operation.Hash}'{publishingInfo}");

foreach (var err in operation.Errors)
{
var errorLocation = string.Empty;
if (err.Locations is { Count: > 0 } locations)
{
errorLocation = $"({locations[0].Line}:{locations[0].Column})";
}

operationNode.AddNode($"{err.Message.EscapeMarkup()} {errorLocation}");
}
}
AddPersistedQueryValidationErrors(clientNode, error);

return node;
}
Expand All @@ -79,7 +61,7 @@ public static IHasTreeNodes AddPersistedQueryValidationErrors(
foreach (var operation in error.Queries)
{
var publishingInfo = operation.DeployedTags.Count > 0
? $" (Deployed tags: {string.Join(",", operation.DeployedTags)})"
? $" [dim](Deployed tags: {string.Join(",", operation.DeployedTags)})[/]"
: "";

var operationNode = node.AddNode($"Operation '{operation.Hash}'{publishingInfo}");
Expand All @@ -89,10 +71,10 @@ public static IHasTreeNodes AddPersistedQueryValidationErrors(
var errorLocation = string.Empty;
if (err.Locations is { Count: > 0 } locations)
{
errorLocation = $"({locations[0].Line}:{locations[0].Column})";
errorLocation = $" [dim]({locations[0].Line}:{locations[0].Column})[/]";
}

operationNode.AddNode($"{err.Message.EscapeMarkup()} {errorLocation}");
operationNode.AddNode(err.Message.AsError() + errorLocation);
}
}

Expand All @@ -107,7 +89,7 @@ public static IHasTreeNodes AddOpenApiCollectionValidationErrors(
{
var openApiCollection = collectionError.OpenApiCollection;
var collectionNode = node.AddNode(
$"OpenAPI collection '{openApiCollection?.Name.EscapeMarkup()}' (ID: {openApiCollection?.Id})");
$"OpenAPI collection '{openApiCollection?.Name.EscapeMarkup()}' [dim](ID: {openApiCollection?.Id})[/]");

foreach (var entity in collectionError.Entities)
{
Expand All @@ -120,14 +102,14 @@ public static IHasTreeNodes AddOpenApiCollectionValidationErrors(
var errorLocation = string.Empty;
if (documentError.Locations is { Count: > 0 } locations)
{
errorLocation = $"({locations[0].Line}:{locations[0].Column})";
errorLocation = $" [dim]({locations[0].Line}:{locations[0].Column})[/]";
}

entityNode.AddNode($"{documentError.Message.EscapeMarkup()} {errorLocation}");
entityNode.AddNode(documentError.Message.AsError() + errorLocation);
}
else if (entityError is IOpenApiCollectionValidationEntityValidationError entityValidationError)
{
entityNode.AddNode(entityValidationError.Message.EscapeMarkup());
entityNode.AddErrorMessage(entityValidationError.Message);
}
else
{
Expand Down Expand Up @@ -158,7 +140,7 @@ public static IHasTreeNodes AddMcpFeatureCollectionValidationErrors(
{
var mcpFeatureCollection = collectionError.McpFeatureCollection;
var collectionNode = node.AddNode(
$"MCP Feature Collection '{mcpFeatureCollection?.Name.EscapeMarkup()}' (ID: {mcpFeatureCollection?.Id})");
$"MCP Feature Collection '{mcpFeatureCollection?.Name.EscapeMarkup()}' [dim](ID: {mcpFeatureCollection?.Id})[/]");

foreach (var entity in collectionError.Entities)
{
Expand All @@ -171,14 +153,14 @@ public static IHasTreeNodes AddMcpFeatureCollectionValidationErrors(
var errorLocation = string.Empty;
if (documentError.Locations is { Count: > 0 } locations)
{
errorLocation = $"({locations[0].Line}:{locations[0].Column})";
errorLocation = $" [dim]({locations[0].Line}:{locations[0].Column})[/]";
}

entityNode.AddNode($"{documentError.Message.EscapeMarkup()} {errorLocation}");
entityNode.AddNode(documentError.Message.AsError() + errorLocation);
}
else if (entityError is IMcpFeatureCollectionValidationEntityValidationError entityValidationError)
{
entityNode.AddNode(entityValidationError.Message.EscapeMarkup());
entityNode.AddErrorMessage(entityValidationError.Message);
}
else
{
Expand Down
2 changes: 2 additions & 0 deletions src/Nitro/CommandLine/src/CommandLine/Helpers/Constants.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ namespace ChilliCream.Nitro.CommandLine.Helpers;

internal static class Constants
{
public const int DefaultPrintWidth = 1_000;

// 5 Minutes
public const int DefaultTimeoutSec = 60 * 5;

Expand Down
15 changes: 14 additions & 1 deletion src/Nitro/CommandLine/src/CommandLine/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,15 +32,28 @@ public static async Task<int> Main(string[] args)
services.AddSingleton<INitroClientContextProvider>(sp => sp.GetRequiredService<NitroClientContext>());
services.AddNitroClients();

var outConsole = AnsiConsole.Console;
var errorConsole = AnsiConsole.Create(new AnsiConsoleSettings
{
Out = new AnsiConsoleOutput(Console.Error)
});

// When output is not a terminal (CI, pipes), Spectre.Console defaults
// to 80 chars width. Use a wide width so the consumer handles wrapping.
if (Console.IsOutputRedirected)
{
outConsole.Profile.Width = Constants.DefaultPrintWidth;
}

if (Console.IsErrorRedirected)
{
errorConsole.Profile.Width = Constants.DefaultPrintWidth;
}

services
.AddSingleton<INitroConsole>(sp =>
new NitroConsole(
AnsiConsole.Console,
outConsole,
errorConsole,
sp.GetRequiredService<IEnvironmentVariableProvider>()));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,13 @@ private void RenderEntry(

RenderIcon(segments, entry);

segments.Add(new Segment(entry.Text));
var textStyle = entry.State switch
{
ActivityState.Failed => new Style(Color.Red),
ActivityState.Warning => new Style(Color.Yellow),
_ => Style.Plain
};
segments.Add(new Segment(entry.Text, textStyle));
segments.Add(Segment.LineBreak);

for (var i = 0; i < entry.Children.Count; i++)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,7 @@ namespace ChilliCream.Nitro.CommandLine;

internal interface INitroConsoleActivity : IAsyncDisposable
{
void Update(string message, ActivityUpdateKind kind = ActivityUpdateKind.Regular);

void Update(string message, IRenderable details, ActivityUpdateKind kind = ActivityUpdateKind.Regular);
void Update(string message, ActivityUpdateKind kind = ActivityUpdateKind.Regular, IRenderable? details = null);

void Warning(string message);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,19 +25,10 @@ private InteractiveNitroConsoleActivity(
_refreshTimer = refreshTimer;
}

public void Update(string message, ActivityUpdateKind kind = ActivityUpdateKind.Regular)
{
var state = kind switch
{
ActivityUpdateKind.Warning => ActivityState.Warning,
ActivityUpdateKind.Waiting => ActivityState.Waiting,
ActivityUpdateKind.Success => ActivityState.Completed,
_ => ActivityState.Info
};
_tree.AddChild(_rootEntry, message, state);
}

public void Update(string message, IRenderable details, ActivityUpdateKind kind = ActivityUpdateKind.Regular)
public void Update(
string message,
ActivityUpdateKind kind = ActivityUpdateKind.Regular,
IRenderable? details = null)
{
var state = kind switch
{
Expand All @@ -47,7 +38,10 @@ public void Update(string message, IRenderable details, ActivityUpdateKind kind
_ => ActivityState.Info
};
var child = _tree.AddChild(_rootEntry, message, state);
_tree.SetEntryDetails(child, details);
if (details is not null)
{
_tree.SetEntryDetails(child, details);
}
}

public void Warning(string message)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,19 +11,10 @@ internal sealed class InteractiveNitroConsoleChildActivity(
{
private bool _completed;

public void Update(string message, ActivityUpdateKind kind = ActivityUpdateKind.Regular)
{
var state = kind switch
{
ActivityUpdateKind.Warning => ActivityState.Warning,
ActivityUpdateKind.Waiting => ActivityState.Waiting,
ActivityUpdateKind.Success => ActivityState.Completed,
_ => ActivityState.Info
};
tree.AddChild(entry, message, state);
}

public void Update(string message, IRenderable details, ActivityUpdateKind kind = ActivityUpdateKind.Regular)
public void Update(
string message,
ActivityUpdateKind kind = ActivityUpdateKind.Regular,
IRenderable? details = null)
{
var state = kind switch
{
Expand All @@ -33,7 +24,10 @@ public void Update(string message, IRenderable details, ActivityUpdateKind kind
_ => ActivityState.Info
};
var child = tree.AddChild(entry, message, state);
tree.SetEntryDetails(child, details);
if (details is not null)
{
tree.SetEntryDetails(child, details);
}
}

public void Warning(string message)
Expand Down
Loading
Loading