using System.Diagnostics.CodeAnalysis; namespace SharedKernel.Results; public class Result { public Result(bool isSuccess, Error error) { if (isSuccess && error != Error.None || !isSuccess && error == Error.None) { throw new ArgumentException("Invalid error", nameof(error)); } IsSuccess = isSuccess; Error = error; } public bool IsSuccess { get; } public bool IsFailure => !IsSuccess; public Error Error { get; } public static Result Success() { return new(true, Error.None); } public static Result Success(TValue value) { return new(value, true, Error.None); } public static Result Failure(Error error) { return new(false, error); } public static Result Failure(Error error) { return new(default, false, error); } } public class Result : Result { private readonly TValue? _value; public Result(TValue? value, bool isSuccess, Error error) : base(isSuccess, error) { _value = value; } [NotNull] public TValue Value => IsSuccess ? _value! : throw new InvalidOperationException("The value of a failure result can't be accessed."); public static implicit operator Result(TValue? value) { return value is not null ? Success(value) : Failure(Error.NullValue); } }