namespace Fleet.Core;
public record FleetError(ErrorCode Code, string Message)
{
public override string ToString() => $"{Code}: {Message}";
}
/// 预期内的失败用结果表示,不抛异常。
public readonly struct Result
{
private readonly T? _value;
private readonly FleetError? _error;
private Result(T? value, FleetError? error)
{
_value = value;
_error = error;
}
public bool IsSuccess => _error is null;
public T Value => _error is null ? _value! : throw new InvalidOperationException(_error.ToString());
public FleetError Error => _error ?? throw new InvalidOperationException("Result is successful.");
public static Result Ok(T value) => new(value, null);
public static Result Fail(FleetError error) => new(default, error);
public static Result Fail(ErrorCode code, string message) => new(default, new FleetError(code, message));
public bool TryGet(out T value, out FleetError error)
{
value = _value!;
error = _error!;
return _error is null;
}
public Result Map(Func map) =>
_error is null ? Result.Ok(map(_value!)) : Result.Fail(_error);
public static implicit operator Result(FleetError error) => Fail(error);
}
public static class Result
{
public static Result Ok(T value) => Result.Ok(value);
public static Result Fail(ErrorCode code, string message) => Result.Fail(code, message);
}