diff --git a/NodePipeline.Reporting.Abstractions/IPipelineRegistrationReporter.cs b/NodePipeline.Reporting.Abstractions/IPipelineRegistrationReporter.cs new file mode 100644 index 0000000..eb9a061 --- /dev/null +++ b/NodePipeline.Reporting.Abstractions/IPipelineRegistrationReporter.cs @@ -0,0 +1,15 @@ +using System.Threading; +using System.Threading.Tasks; +using NodePipeline.Abstractions; +using NodePipeline.Abstractions.Exceptions; + +namespace NodePipeline.Reporting.Abstractions +{ + public interface IPipelineRegistrationReporter + { + void ReportSuccess(PipelineRegistrationResult result, string pipelineId); + Task ReportSuccessAsync(PipelineRegistrationResult result, string pipelineId, CancellationToken cancellationToken); + void ReportFailure(PipelineValidationException exception); + Task ReportFailureAsync(PipelineValidationException exception, CancellationToken cancellationToken); + } +} \ No newline at end of file diff --git a/NodePipeline.Reporting.Abstractions/NodePipeline.Reporting.Abstractions.csproj b/NodePipeline.Reporting.Abstractions/NodePipeline.Reporting.Abstractions.csproj new file mode 100644 index 0000000..0b4e502 --- /dev/null +++ b/NodePipeline.Reporting.Abstractions/NodePipeline.Reporting.Abstractions.csproj @@ -0,0 +1,12 @@ + + + + netstandard2.1 + enable + + + + + + + diff --git a/NodePipeline.Reporting.Console/ConsolePipelineRegistrationReporter.cs b/NodePipeline.Reporting.Console/ConsolePipelineRegistrationReporter.cs new file mode 100644 index 0000000..05c0a33 --- /dev/null +++ b/NodePipeline.Reporting.Console/ConsolePipelineRegistrationReporter.cs @@ -0,0 +1,177 @@ +using System; +using System.Globalization; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using NodePipeline.Abstractions; +using NodePipeline.Abstractions.Exceptions; +using NodePipeline.Abstractions.Interfaces; +using NodePipeline.Abstractions.Models.Validation; +using NodePipeline.Reporting.Abstractions; + +namespace NodePipeline.Reporting.Console +{ + public class ConsolePipelineRegistrationReporter : IPipelineRegistrationReporter + { + + private readonly IPipelineLocalizationProvider _validationLocalizationProvider; + + public void ReportSuccess(PipelineRegistrationResult result) + { + // var backgroundColor = System.Console.BackgroundColor; + // var foregroundColor = System.Console.ForegroundColor; + // System.Console.Write($"Pipeline "); + // System.Console.ForegroundColor = ConsoleColor.DarkYellow; + // System.Console.Write($"[{pipelineId}] "); + // System.Console.ForegroundColor = ConsoleColor.Green; + // System.Console.WriteLine($"successfully registered"); + // System.Console.ForegroundColor = foregroundColor; + + + var color = System.Console.ForegroundColor; + System.Console.ForegroundColor = ConsoleColor.DarkGray; + var warnings = result.NodeWarnings; + System.Console.ForegroundColor = + result.WarningsCount == 0 ? ConsoleColor.DarkGreen : ConsoleColor.DarkYellow; + System.Console.WriteLine(result.WarningsCount == 0 + ? _validationLocalizationProvider.GetLocalizedString("PipelineRegistered", CultureInfo.CurrentCulture, + result.PipelineId) + : _validationLocalizationProvider.GetLocalizedString("PipelineRegisteredWithWarnings", + CultureInfo.CurrentCulture, result.PipelineId, result.WarningsCount)); + //TODO: add messages + //TODO: add method GetMessages to exceptions + + if (result.WarningsCount > 0) + { + System.Console.WriteLine("Nodes:"); + + foreach (var nodeKvp in warnings.OrderBy(q => q.Key)) + { + System.Console.ForegroundColor = ConsoleColor.DarkYellow; + System.Console.WriteLine($"\t[{nodeKvp.Key}]"); + System.Console.ForegroundColor = color; + + var warningParameters = nodeKvp.Value.ParameterResults + .Where(q => q.Value.Any(x => x.Result == ValidationResult.HasWarnings)) + .ToDictionary(q => q.Key, q => q.Value); + var warningPorts = nodeKvp.Value.PortResults + .Where(q => q.Value.Any(x => x.Result == ValidationResult.HasWarnings)) + .ToDictionary(q => q.Key, q => q.Value); + + if (warningParameters.Count > 0) + { + System.Console.WriteLine("\t\tParameters:"); + System.Console.ForegroundColor = ConsoleColor.DarkYellow; + foreach (var parameter in warningParameters.OrderBy(q => q.Key)) + // foreach (var warning in parameter.Value.OrderBy(q => q.ErrorMessage)) + foreach (var warning in parameter.Value) + System.Console.WriteLine(string.Concat("\t\t[WARN] ", parameter.Key, ": ", warning.ErrorMessage)); + } + + if (warningPorts.Count > 0) + { + System.Console.WriteLine("\t\tPorts:"); + System.Console.ForegroundColor = ConsoleColor.DarkYellow; + foreach (var parameter in warningPorts.OrderBy(q => q.Key)) + foreach (var warning in parameter.Value) + System.Console.WriteLine(string.Concat("\t\t[WARN] ", parameter.Key, ": ", warning.ErrorMessage)); + } + } + } + + System.Console.ForegroundColor = color; + } + + public async Task ReportSuccessAsync(PipelineRegistrationResult result, CancellationToken cancellationToken) + { + ReportSuccess(result); + await Task.CompletedTask; + } + + public void ReportFailure(PipelineValidationException exception) + { + var color = System.Console.ForegroundColor; + System.Console.ForegroundColor = ConsoleColor.DarkGray; + System.Console.WriteLine(_validationLocalizationProvider.GetLocalizedString(exception.Message, CultureInfo.CurrentCulture, + exception.PipelineId, exception.RegistrationResult.ErrorsCount, exception.RegistrationResult.WarningsCount)); + System.Console.ForegroundColor = ConsoleColor.DarkYellow; + System.Console.Write($"Warnings: [{exception.RegistrationResult.WarningsCount}] | "); + System.Console.ForegroundColor = ConsoleColor.DarkRed; + System.Console.WriteLine($"Errors: [{exception.RegistrationResult.ErrorsCount}]"); + System.Console.ForegroundColor = color; + System.Console.WriteLine(new string('-', 30)); + System.Console.WriteLine("Nodes:"); + + foreach (var nodeKvp in exception.RegistrationResult.GetNotValidNodes().OrderBy(q => q.Key)) + { + System.Console.ForegroundColor = nodeKvp.Value.Result == ValidationResult.HasWarnings + ? ConsoleColor.DarkYellow + : ConsoleColor.DarkRed; + System.Console.WriteLine($"\t[{nodeKvp.Key}]"); + System.Console.ForegroundColor = color; + + // var warningParameters = ex.WarningParameters.TryGetValue(nodeKvp.Key, out var value); + // var errorParameters = ex.ErrorParameters.TryGetValue(nodeKvp.Key); + // var warningPorts = ex.WarningPorts[nodeKvp.Key]; + // var errorPorts = ex.ErrorPorts[nodeKvp.Key]; + + if ((exception.RegistrationResult.WarningParameters.TryGetValue(nodeKvp.Key, out var warningParameters) && + warningParameters.Count > 0) + | (exception.RegistrationResult.ErrorParameters.TryGetValue(nodeKvp.Key, out var errorParameters) && + errorParameters.Count > 0)) + { + System.Console.WriteLine("\t\tParameters:"); + if (warningParameters?.Count > 0) + { + System.Console.ForegroundColor = ConsoleColor.DarkYellow; + foreach (var parameter in warningParameters.OrderBy(q => q.Key)) + // foreach (var warning in parameter.Value.OrderBy(q => q.ErrorMessage)) + foreach (var warning in parameter.Value) + System.Console.WriteLine(string.Concat("\t\t[WARN] ", parameter.Key, ": ", warning.ErrorMessage)); + } + + if (errorParameters?.Count > 0) + { + System.Console.ForegroundColor = ConsoleColor.DarkRed; + foreach (var parameter in errorParameters.OrderBy(q => q.Key)) + // foreach (var error in parameter.Value.OrderBy(q => q.ErrorMessage)) + foreach (var error in parameter.Value) + System.Console.WriteLine(string.Concat("\t\t[ERRO] ", parameter.Key, ": ", error.ErrorMessage)); + } + } + + if ((exception.RegistrationResult.WarningPorts.TryGetValue(nodeKvp.Key, out var warningPorts) && + warningPorts.Count > 0) + | (exception.RegistrationResult.ErrorPorts.TryGetValue(nodeKvp.Key, out var errorPorts) && + errorPorts.Count > 0)) + { + System.Console.WriteLine("\t\tPorts:"); + if (warningPorts?.Count > 0) + { + System.Console.ForegroundColor = ConsoleColor.DarkYellow; + foreach (var port in warningPorts.OrderBy(q => q.Key)) + // foreach (var warning in parameter.Value.OrderBy(q => q.ErrorMessage)) + foreach (var warning in port.Value) + System.Console.WriteLine(string.Concat("\t\t[WARN] ", port.Key, ": ", warning.ErrorMessage)); + } + + if (!(errorPorts?.Count > 0)) continue; + + System.Console.ForegroundColor = ConsoleColor.DarkRed; + foreach (var port in errorPorts.OrderBy(q => q.Key)) + // foreach (var error in parameter.Value.OrderBy(q => q.ErrorMessage)) + foreach (var error in port.Value) + System.Console.WriteLine(string.Concat("\t\t[ERRO] ", port.Key, ": ", error.ErrorMessage)); + } + } + + System.Console.ForegroundColor = color; + } + + public async Task ReportFailureAsync(PipelineValidationException exception, CancellationToken cancellationToken) + { + ReportFailure(exception); + await Task.CompletedTask; + } + } +} \ No newline at end of file diff --git a/NodePipeline.Reporting.Console/NodePipeline.Reporting.Console.csproj b/NodePipeline.Reporting.Console/NodePipeline.Reporting.Console.csproj new file mode 100644 index 0000000..417ef29 --- /dev/null +++ b/NodePipeline.Reporting.Console/NodePipeline.Reporting.Console.csproj @@ -0,0 +1,12 @@ + + + + netstandard2.1 + enable + + + + + + +