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
+
+
+
+
+
+
+