-
Notifications
You must be signed in to change notification settings - Fork 4
/
Result.cs
63 lines (48 loc) · 1.75 KB
/
Result.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#nullable enable
namespace Nemesis.TextParsers.CodeGen.Utils;
internal readonly struct Result<TValue, TError>
{
private readonly State _state;
private readonly TValue? _value;
private readonly TError? _error;
public TValue Value => IsSuccess ? _value! : throw new InvalidOperationException("Value can only be retrieved in 'Success' state");
public bool IsSuccess => _state == State.Success;
public bool IsError => _state == State.Error;
public bool IsNone => _state == State.None;
private Result(TValue value)
{
_value = value;
_error = default;
_state = State.Success;
}
private Result(TError error)
{
_value = default;
_error = error;
_state = State.Error;
}
public Result()
{
_value = default;
_error = default;
_state = State.None;
}
public static Result<TValue, TError> None() => new();
public static implicit operator Result<TValue, TError>(TValue result) => new(result);
public static implicit operator Result<TValue, TError>(TError error) => new(error);
/*public TResult Match<TResult>(Func<TValue, TResult> success, Func<TError, TResult> failure) =>
IsError ? failure(Error!) : success(Value!);*/
public void Invoke(Action<TValue> success, Action<TError>? failure = null)
{
if (IsSuccess) success(_value!);
else if (IsError) failure?.Invoke(_error!);
}
public override string? ToString() => _state switch
{
State.Success => _value?.ToString(),
State.Error => _error?.ToString(),
State.None => "<None>",
_ => throw new NotSupportedException($"State {_state} is not supported")
};
enum State : byte { None, Success, Error }
}