namespace Govor.Domain.Common; public class Result { protected Result(bool isSuccess, Error error) { if (isSuccess && error != Error.None || !isSuccess && error == Error.None) { throw new ArgumentException("Invalid error state", nameof(error)); } IsSuccess = isSuccess; Error = error; } public bool IsSuccess { get; } public bool IsFailure => !IsSuccess; public Error Error { get; } public static Result Success() => new(true, Error.None); public static Result Failure(Error error) => new(false, error); public static Result Failure(Exception ex) => new(false, new Error(ex.GetType().Name, ex.Message)); public static implicit operator Result(Error error) => Failure(error); } public class Result : Result { private readonly T? _value; private Result(T? value, bool isSuccess, Error error) : base(isSuccess, error) { _value = value; } public T Value => IsSuccess ? _value! : throw new InvalidOperationException("The value of a failure result cannot be accessed."); public static Result Success(T value) => new(value, true, Error.None); public static new Result Failure(Error error) => new(default, false, error); public static new Result Failure(Exception ex) => new(default, false, new Error(ex.GetType().Name, ex.Message)); public static implicit operator Result(T value) => Success(value); public static implicit operator Result(Error error) => Failure(error); public static implicit operator T(Result result) => result.Value; }