using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using NodePipeline.Abstractions.Models.Validation; // ReSharper disable MemberCanBePrivate.Global // ReSharper disable UnusedAutoPropertyAccessor.Global namespace NodePipeline.Abstractions; public class PipelineRegistrationResult { private readonly Dictionary _nodeValidationResults; private Dictionary>>? _errorParameters; private Dictionary>>? _errorPorts; private int? _errorsCount; private Dictionary? _invalidNodes; private Dictionary>>? _invalidParameters; private Dictionary>>? _invalidPorts; private Dictionary? _nodeErrors; private Dictionary? _nodeWarnings; private Dictionary>>? _warningParameters; private Dictionary>>? _warningPorts; private int? _warningsCount; public PipelineRegistrationResult(string pipelineId, bool isRegistered, Dictionary nodeValidationResults, bool treatWarningsAsErrors) { PipelineId = pipelineId; IsRegistered = isRegistered; _nodeValidationResults = nodeValidationResults .ToDictionary(x => x.Key, x => x.Value); TreatWarningsAsErrors = treatWarningsAsErrors; } public string PipelineId { get; } public bool IsRegistered { get; } public IReadOnlyDictionary NodeValidationResults => new ReadOnlyDictionary(_nodeValidationResults); public bool TreatWarningsAsErrors { get; } public IReadOnlyDictionary NodeErrors { get { _nodeErrors ??= _nodeValidationResults .Where(q => q.Value.Result == ValidationResult.HasErrors) .ToDictionary(q => q.Key, q => q.Value); return new ReadOnlyDictionary(_nodeErrors); } } public IReadOnlyDictionary NodeWarnings { get { _nodeWarnings ??= _nodeValidationResults .Where(q => q.Value.Result == ValidationResult.HasWarnings) .ToDictionary(q => q.Key, q => q.Value); return new ReadOnlyDictionary(_nodeWarnings); } } public IReadOnlyDictionary InvalidNodes { get { _invalidNodes ??= _nodeValidationResults .Where(q => ValidationHelper.IsValid(q.Value.Result, TreatWarningsAsErrors)) .ToDictionary(q => q.Key, q => q.Value); return new ReadOnlyDictionary(_invalidNodes); } } public IReadOnlyDictionary>> ErrorParameters { get { _errorParameters ??= NodeErrors .ToDictionary(q => q.Key, IReadOnlyDictionary> (q) => new ReadOnlyDictionary>(q.Value.ParameterResults .Where(x => x.Value.Any(z => z.Result == ValidationResult.HasErrors)) .ToDictionary(x => x.Key, x => x.Value) )); return new ReadOnlyDictionary>>( _errorParameters); } } public IReadOnlyDictionary>> WarningParameters { get { _warningParameters ??= NodeValidationResults.Where(q => q.Value.Result != ValidationResult.Valid) .ToDictionary(q => q.Key, IReadOnlyDictionary> (q) => new ReadOnlyDictionary>(q.Value.ParameterResults .Where(x => x.Value.Any(z => z.Result == ValidationResult.HasWarnings)) .ToDictionary(x => x.Key, x => x.Value) )); return new ReadOnlyDictionary>>( _warningParameters); } } public IReadOnlyDictionary>> InvalidParameters { get { _invalidParameters ??= InvalidNodes .ToDictionary(q => q.Key, IReadOnlyDictionary> (q) => new ReadOnlyDictionary>(q.Value.ParameterResults .Where(x => ValidationHelper.IsValid(x.Value.Select(z => z.Result), TreatWarningsAsErrors)) .ToDictionary(x => x.Key, x => x.Value) )); return new ReadOnlyDictionary>>( _invalidParameters); } } public IReadOnlyDictionary>> ErrorPorts { get { _errorPorts ??= NodeErrors .ToDictionary(q => q.Key, IReadOnlyDictionary> (q) => new ReadOnlyDictionary>(q.Value.PortResults .Where(x => x.Value.Any(z => z.Result == ValidationResult.HasErrors)) .ToDictionary(x => x.Key, x => x.Value) )); return new ReadOnlyDictionary>>( _errorPorts); } } public IReadOnlyDictionary>> WarningPorts { get { _warningPorts ??= NodeValidationResults.Where(q => q.Value.Result != ValidationResult.Valid) .ToDictionary(q => q.Key, IReadOnlyDictionary> (q) => new ReadOnlyDictionary>(q.Value.PortResults .Where(x => x.Value.Any(z => z.Result == ValidationResult.HasWarnings)) .ToDictionary(x => x.Key, x => x.Value) )); return new ReadOnlyDictionary>>( _warningPorts); } } public IReadOnlyDictionary>> InvalidPorts { get { _invalidPorts ??= InvalidNodes .ToDictionary(q => q.Key, IReadOnlyDictionary> (q) => new ReadOnlyDictionary>(q.Value.PortResults .Where(x => ValidationHelper.IsValid(x.Value.Select(z => z.Result), TreatWarningsAsErrors)) .ToDictionary(x => x.Key, x => x.Value) )); return new ReadOnlyDictionary>>( _invalidPorts); } } public int WarningsCount { get { _warningsCount ??= WarningParameters.Sum(q => q.Value.Count) + WarningPorts.Sum(q => q.Value.Count); return _warningsCount.Value; } } public int ErrorsCount { get { _errorsCount ??= ErrorParameters.Sum(q => q.Value.Count) + ErrorPorts.Sum(q => q.Value.Count); return _errorsCount.Value; } } public IReadOnlyDictionary GetNotValidNodes() { return new ReadOnlyDictionary(NodeValidationResults .Where(q => q.Value.Result != ValidationResult.Valid) .ToDictionary(kvp => kvp.Key, kvp => kvp.Value)); } }