Result.cs 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. using System.Diagnostics.CodeAnalysis;
  2. namespace SharedKernel.Results;
  3. public class Result
  4. {
  5. public Result(bool isSuccess, Error error)
  6. {
  7. if (isSuccess && error != Error.None || !isSuccess && error == Error.None)
  8. {
  9. throw new ArgumentException("Invalid error", nameof(error));
  10. }
  11. IsSuccess = isSuccess;
  12. Error = error;
  13. }
  14. public bool IsSuccess { get; }
  15. public bool IsFailure => !IsSuccess;
  16. public Error Error { get; }
  17. public static Result Success()
  18. {
  19. return new(true, Error.None);
  20. }
  21. public static Result<TValue> Success<TValue>(TValue value)
  22. {
  23. return new(value, true, Error.None);
  24. }
  25. public static Result Failure(Error error)
  26. {
  27. return new(false, error);
  28. }
  29. public static Result<TValue> Failure<TValue>(Error error)
  30. {
  31. return new(default, false, error);
  32. }
  33. }
  34. public class Result<TValue> : Result
  35. {
  36. private readonly TValue? _value;
  37. public Result(TValue? value, bool isSuccess, Error error) : base(isSuccess, error)
  38. {
  39. _value = value;
  40. }
  41. [NotNull]
  42. public TValue Value => IsSuccess ? _value! : throw new InvalidOperationException("The value of a failure result can't be accessed.");
  43. public static implicit operator Result<TValue>(TValue? value)
  44. {
  45. return value is not null ? Success(value) : Failure<TValue>(Error.NullValue);
  46. }
  47. }