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); }