Files
Just.Railway/Railway/Ensure.cs
JustFixMe 3d34a3021d
All checks were successful
.NET Test / test (push) Successful in 1m14s
added TryRecover extensions
2023-12-18 18:24:15 +04:00

73 lines
2.3 KiB
C#

namespace Just.Railway;
public static partial class Ensure
{
public delegate Error ErrorFactory(string valueExpression);
public const string DefaultErrorType = "EnsureFailed";
[Pure] public static Ensure<T> That<T>(T value, [CallerArgumentExpression(nameof(value))]string valueExpression = "") => new(value, valueExpression);
[Pure] public static Result<T> Result<T>(this in Ensure<T> ensure) => ensure.State switch
{
ResultState.Success => new(ensure.Value),
ResultState.Error => new(ensure.Error!),
_ => throw new EnsureNotInitializedException(nameof(ensure))
};
[Pure] public static async Task<Result<T>> Result<T>(this Task<Ensure<T>> ensureTask)
{
var ensure = await ensureTask.ConfigureAwait(false);
return ensure.State switch
{
ResultState.Success => new(ensure.Value),
ResultState.Error => new(ensure.Error!),
_ => throw new EnsureNotInitializedException(nameof(ensureTask))
};
}
[Pure] public static async ValueTask<Result<T>> Result<T>(this ValueTask<Ensure<T>> ensureTask)
{
var ensure = await ensureTask.ConfigureAwait(false);
return ensure.State switch
{
ResultState.Success => new(ensure.Value),
ResultState.Error => new(ensure.Error!),
_ => throw new EnsureNotInitializedException(nameof(ensureTask))
};
}
}
public readonly struct Ensure<T>
{
internal readonly ResultState State;
internal readonly Error? Error;
internal readonly T Value;
internal readonly string ValueExpression;
internal Ensure(T value, string valueExpression)
{
Value = value;
ValueExpression = valueExpression;
State = ResultState.Success;
Error = default;
}
internal Ensure(Error error, string valueExpression)
{
Error = error;
ValueExpression = valueExpression;
Value = default!;
State = ResultState.Error;
}
}
[Serializable]
public class EnsureNotInitializedException : InvalidOperationException
{
public EnsureNotInitializedException(string variableName = "this")
: base("Ensure was not properly initialized.")
{
VariableName = variableName;
}
public string VariableName { get; }
}