using DotBased.AspNet.Authority.Models.Validation; using DotBased.Monads; namespace DotBased.AspNet.Authority.Monads; public class ValidationResult : Result { private ValidationResult(T result) : base(result) { } private ValidationResult(Exception exception) : base(exception) { } private ValidationResult(ResultError error) : base(error) { } private ValidationResult(List validationErrors) : base(ResultError.Fail("Validation failed!")) { _validationErrors = validationErrors; } private readonly List _validationErrors = []; public IReadOnlyList ValidationErrors => _validationErrors; public static implicit operator ValidationResult(T result) => new(result); public static implicit operator ValidationResult(Exception exception) => new(exception); public static implicit operator ValidationResult(ResultError error) => new(error); public static implicit operator ValidationResult(List validationErrors) => new(validationErrors); public static ValidationResult FromResult(Result result) { var authorityResult = result.Match>( r => new ValidationResult(r), error => new ValidationResult(error)); return authorityResult; } public TMatch Match(Func success, Func, TMatch> failure) => IsSuccess && Value != null ? success(Value) : failure(Error ?? ResultError.Fail("No error and value is null!"), ValidationErrors); }