diff --git a/DotBased.AspNet.Authority/Monads/ValidationResult.cs b/DotBased.AspNet.Authority/Monads/ValidationResult.cs new file mode 100644 index 0000000..6d4dfc7 --- /dev/null +++ b/DotBased.AspNet.Authority/Monads/ValidationResult.cs @@ -0,0 +1,20 @@ +using DotBased.Monads; + +namespace DotBased.AspNet.Authority.Monads; + +public class ValidationResult : DotBased.Monads.Result +{ + private ValidationResult(T result) : base(result) + { + } + + private ValidationResult(Exception exception) : base(exception) + { + } + + private ValidationResult(ResultInformation information) : base(information) + { + } + + +} \ No newline at end of file diff --git a/DotBased/Monads/Result.cs b/DotBased/Monads/Result.cs new file mode 100644 index 0000000..c94724b --- /dev/null +++ b/DotBased/Monads/Result.cs @@ -0,0 +1,84 @@ +namespace DotBased.Monads; + +public class Result +{ + protected Result() + { + IsSuccess = true; + } + + protected Result(Exception exception) + { + IsSuccess = false; + Information = ResultInformation.Error(exception); + } + + protected Result(ResultInformation information) + { + IsSuccess = false; + Information = information; + } + + public bool IsSuccess { get; } + public ResultInformation? Information { get; set; } + + public static implicit operator Result(Exception exception) => new(exception); + public static implicit operator Result(ResultInformation information) => new(information); + + public static Result Success() => new(); + public static Result Error(ResultInformation information) => new(information); + public static Result Fail(Exception exception) => new(exception); + + + public TMatch Match(Func success, Func failure) => IsSuccess ? success() : failure(Information!); +} + +public class Result : Result +{ + protected Result(TResult result) + { + _result = result; + } + + protected Result(Exception exception) : base(exception) + { + _result = default; + } + + protected Result(ResultInformation information) : base(information) + { + _result = default; + } + + private readonly TResult? _result; + public TResult Value => IsSuccess ? _result! : throw new InvalidOperationException("Result is invalid"); + + public static implicit operator Result(TResult result) => new(result); + public static implicit operator Result(Exception exception) => new(exception); + public static implicit operator Result(ResultInformation information) => new(information); + + public static Result Success(TResult result) => new(result); + public new static Result Error(ResultInformation information) => new(information); + public new static Result Fail(Exception exception) => new(exception); + + public TMatch Match(Func success, Func failure) + { + return IsSuccess && _result != null ? success(_result) : failure(Information ?? ResultInformation.Fail("No error and value is null!")); + } +} + +public class ResultInformation +{ + private ResultInformation(string message, Exception? exception) + { + Message = message; + Exception = exception; + } + + public string Message { get; } + public Exception? Exception { get; } + + public static ResultInformation Info(string message) => new(message, null); + public static ResultInformation Fail(string message) => new(message, null); + public static ResultInformation Error(Exception exception, string message = "") => new(message, exception); +} \ No newline at end of file