Skip to content

Instantly share code, notes, and snippets.

@stephenkirk
Created May 10, 2020 09:57
Show Gist options
  • Save stephenkirk/58eacbd7a55b019c611f9169707d8d12 to your computer and use it in GitHub Desktop.
Save stephenkirk/58eacbd7a55b019c611f9169707d8d12 to your computer and use it in GitHub Desktop.
Result.cs
public class Result
{
public ICollection<string> Messages { get; set; } = new List<string>();
public ResultStatus Status = ResultStatus.Ok;
public static Result<bool> Validate(bool condition, string error)
=> condition
? new Result<bool>()
: new Result<bool> {Status = ResultStatus.Invalid, Messages = new List<string> {error}};
}
public class Result<T> : Result
{
public T Data { get; set; }
}
public enum ResultStatus
{
Ok,
Invalid,
Failed,
}
public static class ResultExtensions
{
public static Result<T> Validate<T>(this Result<T> prevResult,
bool condition,
string error) =>
prevResult.Status switch
{
ResultStatus.Failed => prevResult,
_ => condition
? prevResult
: new Result<T>
{
Messages = prevResult.Messages.Concat(new[] {error}).ToList(),
Status = ResultStatus.Invalid
}
};
public static Result<T> Validate<T>(this Result<T> prevResult,
Func<T, bool> condition,
string error) =>
prevResult.Status switch
{
ResultStatus.Failed => prevResult,
_ => condition(prevResult.Data)
? prevResult
: new Result<T>
{
Status = ResultStatus.Invalid,
Messages = prevResult.Messages.Concat(new[] {error}).ToList()
}
};
public static Result<F> Map<T, F>(this Result<T> prevResult, Func<T, F> function) =>
prevResult.Status switch
{
ResultStatus.Ok => new Result<F> {Data = function(prevResult.Data)},
_ => new Result<F> {Status = ResultStatus.Failed, Messages = prevResult.Messages}
};
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment