init
This commit is contained in:
58
src/Common/Mccn.Common.Domain/Abstractions/Result.cs
Normal file
58
src/Common/Mccn.Common.Domain/Abstractions/Result.cs
Normal file
@@ -0,0 +1,58 @@
|
||||
namespace Mccn.Common.Domain.Abstractions;
|
||||
|
||||
public class Result
|
||||
{
|
||||
protected Result(bool isSuccess, Error error)
|
||||
{
|
||||
if (isSuccess && error != Error.None)
|
||||
throw new InvalidOperationException();
|
||||
if (!isSuccess && error == Error.None)
|
||||
throw new InvalidOperationException();
|
||||
|
||||
IsSuccess = isSuccess;
|
||||
Error = error;
|
||||
}
|
||||
|
||||
public bool IsSuccess { get; }
|
||||
public bool IsFailure => !IsSuccess;
|
||||
public Error Error { get; }
|
||||
|
||||
public static Result Success()
|
||||
{
|
||||
return new Result(true, Error.None);
|
||||
}
|
||||
|
||||
public static Result Failure(Error error)
|
||||
{
|
||||
return new Result(false, error);
|
||||
}
|
||||
|
||||
public static Result<TValue> Success<TValue>(TValue value)
|
||||
{
|
||||
return new Result<TValue>(value, true, Error.None);
|
||||
}
|
||||
|
||||
public static Result<TValue> Failure<TValue>(Error error)
|
||||
{
|
||||
return new Result<TValue>(default, false, error);
|
||||
}
|
||||
}
|
||||
|
||||
public sealed class Result<TValue> : Result
|
||||
{
|
||||
private readonly TValue? _value;
|
||||
|
||||
internal Result(TValue? value, bool isSuccess, Error error) : base(isSuccess, error)
|
||||
{
|
||||
_value = value;
|
||||
}
|
||||
|
||||
public TValue Value => IsSuccess
|
||||
? _value!
|
||||
: throw new InvalidOperationException("The value of a failure result cannot be accessed.");
|
||||
|
||||
public static implicit operator Result<TValue>(TValue? value)
|
||||
{
|
||||
return value is not null ? Success(value) : Failure<TValue>(Error.NullValue);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user