Result.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  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<E> Flatten<E>(this Result<Result<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. public static Result<T, E> Flatten<T, E>(this Result<Result<T, E>, E> result)
  33. {
  34. if(result.Get(out var inner, out var error))
  35. {
  36. return inner;
  37. }
  38. else
  39. {
  40. return Result.Error(error);
  41. }
  42. }
  43. }
  44. public class OkResult
  45. {
  46. }
  47. public class OkResult<T>
  48. {
  49. public T Value;
  50. public OkResult(T value)
  51. {
  52. Value = value;
  53. }
  54. }
  55. public class ErrorResult<E>
  56. {
  57. public E Error;
  58. public ErrorResult(E error)
  59. {
  60. Error = error;
  61. }
  62. }
  63. public class Result<E>
  64. {
  65. public enum Status
  66. {
  67. Ok,
  68. Error
  69. }
  70. private E _error;
  71. private Status _status;
  72. public Result()
  73. {
  74. _error = default;
  75. _status = Status.Ok;
  76. }
  77. public Result(E error)
  78. {
  79. _error = error;
  80. _status = Status.Error;
  81. }
  82. public static implicit operator Result<E>(OkResult r)
  83. {
  84. return new Result<E>();
  85. }
  86. public static implicit operator Result<E>(ErrorResult<E> r)
  87. {
  88. return new Result<E>(r.Error);
  89. }
  90. public bool Get([NotNullWhen(false)][MaybeNull] out E error)
  91. {
  92. error = _error;
  93. return _status == Status.Ok;
  94. }
  95. public Result<U, E> MapOk<U>(Func<U> mapFunc)
  96. {
  97. if(_status == Status.Ok)
  98. {
  99. return Result.Ok(mapFunc());
  100. }
  101. else
  102. {
  103. return Result.Error(_error);
  104. }
  105. }
  106. public Result<E> MapOk(Action mapFunc)
  107. {
  108. if(_status == Status.Ok)
  109. {
  110. mapFunc();
  111. return Result.Ok();
  112. }
  113. else
  114. {
  115. return Result.Error(_error);
  116. }
  117. }
  118. }
  119. public class Result<T, E>
  120. {
  121. public enum Status
  122. {
  123. Ok,
  124. Error
  125. }
  126. private T _value;
  127. private E _error;
  128. private Status _status;
  129. public bool IsOK => _status == Status.Ok;
  130. public Result(T value)
  131. {
  132. _value = value;
  133. _error = default;
  134. _status = Status.Ok;
  135. }
  136. public Result(E error)
  137. {
  138. _value = default;
  139. _error = error;
  140. _status = Status.Error;
  141. }
  142. public static implicit operator Result<T, E>(OkResult<T> r)
  143. {
  144. return new Result<T, E>(r.Value);
  145. }
  146. public static implicit operator Result<T, E>(ErrorResult<E> r)
  147. {
  148. return new Result<T, E>(r.Error);
  149. }
  150. public bool Get([NotNullWhen(true)][MaybeNull] out T value, [NotNullWhen(false)][MaybeNull] out E error)
  151. {
  152. value = _value;
  153. error = _error;
  154. return _status == Status.Ok;
  155. }
  156. public bool GetOk([NotNullWhen(true)][MaybeNull] out T value)
  157. {
  158. value = _value;
  159. return _status == Status.Ok;
  160. }
  161. public Result<U, E> MapOk<U>(Func<T, U> mapFunc)
  162. {
  163. if(_status == Status.Ok)
  164. {
  165. return Result.Ok(mapFunc(_value));
  166. }
  167. else
  168. {
  169. return Result.Error(_error);
  170. }
  171. }
  172. }
  173. }