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; } } }