Result.cs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics.CodeAnalysis;
  4. using System.Text;
  5. namespace InABox.Core
  6. {
  7. public static class Result
  8. {
  9. public static OkResult Ok()
  10. {
  11. return new OkResult();
  12. }
  13. public static ErrorResult<E> Error<E>(E error)
  14. {
  15. return new ErrorResult<E>(error);
  16. }
  17. public static OkResult<T> Ok<T>(T value)
  18. {
  19. return new OkResult<T>(value);
  20. }
  21. public static Result<T, E> Flatten<T, E>(this Result<Result<T, E>, E> result)
  22. {
  23. if(result.Get(out var inner, out var error))
  24. {
  25. return inner;
  26. }
  27. else
  28. {
  29. return Result.Error(error);
  30. }
  31. }
  32. }
  33. public class OkResult
  34. {
  35. }
  36. public class OkResult<T>
  37. {
  38. public T Value;
  39. public OkResult(T value)
  40. {
  41. Value = value;
  42. }
  43. }
  44. public class ErrorResult<E>
  45. {
  46. public E Error;
  47. public ErrorResult(E error)
  48. {
  49. Error = error;
  50. }
  51. }
  52. public class Result<E>
  53. {
  54. public enum Status
  55. {
  56. Ok,
  57. Error
  58. }
  59. private E _error;
  60. private Status _status;
  61. public Result()
  62. {
  63. _error = default;
  64. _status = Status.Ok;
  65. }
  66. public Result(E error)
  67. {
  68. _error = error;
  69. _status = Status.Error;
  70. }
  71. public static implicit operator Result<E>(OkResult r)
  72. {
  73. return new Result<E>();
  74. }
  75. public static implicit operator Result<E>(ErrorResult<E> r)
  76. {
  77. return new Result<E>(r.Error);
  78. }
  79. public bool Get([NotNullWhen(false)][MaybeNull] out E error)
  80. {
  81. error = _error;
  82. return _status == Status.Ok;
  83. }
  84. public Result<U, E> MapOk<U>(Func<U> mapFunc)
  85. {
  86. if(_status == Status.Ok)
  87. {
  88. return Result.Ok(mapFunc());
  89. }
  90. else
  91. {
  92. return Result.Error(_error);
  93. }
  94. }
  95. public Result<E> MapOk(Action mapFunc)
  96. {
  97. if(_status == Status.Ok)
  98. {
  99. mapFunc();
  100. return Result.Ok();
  101. }
  102. else
  103. {
  104. return Result.Error(_error);
  105. }
  106. }
  107. }
  108. public class Result<T, E>
  109. {
  110. public enum Status
  111. {
  112. Ok,
  113. Error
  114. }
  115. private T _value;
  116. private E _error;
  117. private Status _status;
  118. public bool IsOK => _status == Status.Ok;
  119. public Result(T value)
  120. {
  121. _value = value;
  122. _error = default;
  123. _status = Status.Ok;
  124. }
  125. public Result(E error)
  126. {
  127. _value = default;
  128. _error = error;
  129. _status = Status.Error;
  130. }
  131. public static implicit operator Result<T, E>(OkResult<T> r)
  132. {
  133. return new Result<T, E>(r.Value);
  134. }
  135. public static implicit operator Result<T, E>(ErrorResult<E> r)
  136. {
  137. return new Result<T, E>(r.Error);
  138. }
  139. public bool Get([NotNullWhen(true)][MaybeNull] out T value, [NotNullWhen(false)][MaybeNull] out E error)
  140. {
  141. value = _value;
  142. error = _error;
  143. return _status == Status.Ok;
  144. }
  145. public Result<U, E> MapOk<U>(Func<T, U> mapFunc)
  146. {
  147. if(_status == Status.Ok)
  148. {
  149. return Result.Ok(mapFunc(_value));
  150. }
  151. else
  152. {
  153. return Result.Error(_error);
  154. }
  155. }
  156. }
  157. }