namespace Just.Railway.ValueTaskExtensions; public static partial class ResultValueTaskExtensions { #region Finally public static async ValueTask ValueTaskFinally(this ValueTask resultTask, Action action) { var result = await resultTask; switch (result.State) { case ResultState.Success: case ResultState.Error: action.Invoke(); break; default: throw new ResultNotInitializedException(nameof(resultTask)); } return result; } public static async ValueTask ValueTaskFinally(this Result result, Func action) { switch (result.State) { case ResultState.Success: case ResultState.Error: await action.Invoke(); break; default: throw new ResultNotInitializedException(nameof(result)); } return result; } public static async ValueTask ValueTaskFinally(this ValueTask resultTask, Func action) { var result = await resultTask; switch (result.State) { case ResultState.Success: case ResultState.Error: await action.Invoke(); break; default: throw new ResultNotInitializedException(nameof(resultTask)); } return result; } #endregion #region ValueOr public static async ValueTask ValueTaskValueOr(this ValueTask> resultTask, T fallback) { var result = await resultTask.ConfigureAwait(false); return result.State switch { ResultState.Success => result.Value, ResultState.Error => fallback, _ => throw new ResultNotInitializedException(nameof(resultTask)) }; } public static async ValueTask ValueTaskValueOr(this Result result, Func> fallback) { return result.State switch { ResultState.Success => result.Value, ResultState.Error => await fallback(result.Error!).ConfigureAwait(false), _ => throw new ResultNotInitializedException(nameof(result)) }; } public static async ValueTask ValueTaskValueOr(this ValueTask> resultTask, Func fallback) { var result = await resultTask.ConfigureAwait(false); return result.State switch { ResultState.Success => result.Value, ResultState.Error => fallback(result.Error!), _ => throw new ResultNotInitializedException(nameof(resultTask)) }; } public static async ValueTask ValueTaskValueOr(this ValueTask> resultTask, Func> fallback) { var result = await resultTask.ConfigureAwait(false); return result.State switch { ResultState.Success => result.Value, ResultState.Error => await fallback(result.Error!).ConfigureAwait(false), _ => throw new ResultNotInitializedException(nameof(resultTask)) }; } #endregion }