namespace Mccn.Common.Domain.Abstractions; public class Result { protected Result(bool isSuccess, Error error) { if (isSuccess && error != Error.None) throw new InvalidOperationException(); if (!isSuccess && error == Error.None) throw new InvalidOperationException(); IsSuccess = isSuccess; Error = error; } public bool IsSuccess { get; } public bool IsFailure => !IsSuccess; public Error Error { get; } public static Result Success() { return new Result(true, Error.None); } public static Result Failure(Error error) { return new Result(false, error); } public static Result Success(TValue value) { return new Result(value, true, Error.None); } public static Result Failure(Error error) { return new Result(default, false, error); } } public sealed class Result : Result { private readonly TValue? _value; internal Result(TValue? value, bool isSuccess, Error error) : base(isSuccess, error) { _value = value; } public TValue Value => IsSuccess ? _value! : throw new InvalidOperationException("The value of a failure result cannot be accessed."); public static implicit operator Result(TValue? value) { return value is not null ? Success(value) : Failure(Error.NullValue); } }