using System; using System.Collections.Generic; using System.Diagnostics; namespace PCL.Core.Utils; /// /// 表示一个可能成功或失败的操作结果。 /// 类似于 Rust 的 Result。 /// /// 成功时返回的值类型 /// 失败时返回的错误类型 [DebuggerDisplay("{" + nameof(_DebuggerDisplay) + "}")] public sealed class Result { private readonly TOk? _value; private readonly TErr? _error; private readonly bool _isSuccess; private Result(TOk value) { _value = value; _isSuccess = true; } private Result(TErr error) { _error = error; _isSuccess = false; } /// /// 创建一个成功的结果。 /// public static Result Ok(TOk value) => new(value); /// /// 创建一个失败的结果。 /// public static Result Err(TErr error) => new(error); /// /// 是否为成功状态。 /// public bool IsSuccess => _isSuccess; /// /// 是否为失败状态。 /// public bool IsFailure => !_isSuccess; /// /// 获取成功值(仅在 IsSuccess 为 true 时有效)。 /// public TOk Value => IsSuccess ? _value! : throw new InvalidOperationException("Cannot access Value of a failed Result."); /// /// 获取错误值(仅在 IsFailure 为 true 时有效)。 /// public TErr Error => IsFailure ? _error! : throw new InvalidOperationException("Cannot access Error of a successful Result."); /// /// 使用模式匹配处理成功和失败情况。 /// public TR Match(Func onSuccess, Func onError) => IsSuccess ? onSuccess(_value!) : onError(_error!); /// /// 如果成功,执行一个动作。 /// public void IfSuccess(Action action) { if (IsSuccess) action(_value!); } /// /// 如果失败,执行一个动作。 /// public void IfFailure(Action action) { if (IsFailure) action(_error!); } /// /// 将 Result<T, E> 转换为 Result<T2, E>,通过映射成功值。 /// public Result Map(Func mapper) => IsSuccess ? Result.Ok(mapper(_value!)) : Result.Err(_error!); /// /// 将 Result<T, E> 转换为 Result<T, E2>,通过映射错误值。 /// public Result MapError(Func mapper) => IsSuccess ? Result.Ok(_value!) : Result.Err(mapper(_error!)); /// /// 如果成功,使用函数返回另一个 Result,实现链式调用。 /// 类似于 Rust 的 and_then。 /// public Result Bind(Func> mapper) => IsSuccess ? mapper(_value!) : Result.Err(_error!); /// /// 如果失败,使用函数返回另一个 Result。 /// 类似于 Rust 的 or_else。 /// public Result BindError(Func> mapper) => IsFailure ? mapper(_error!) : Result.Ok(_value!); /// /// 如果失败,提供一个默认值。 /// public TOk OrElse(TOk defaultValue) => IsSuccess ? _value! : defaultValue; /// /// 如果失败,提供一个函数生成默认值。 /// public TOk OrElse(Func defaultValueFactory) => IsSuccess ? _value! : defaultValueFactory(); /// /// 如果失败,抛出异常。 /// public TOk Expect(string message) => IsSuccess ? _value! : throw new InvalidOperationException(message); /// /// 如果失败,抛出指定的异常。 /// public TOk UnwrapOrThrow(Func exceptionFactory) where TException : Exception => IsSuccess ? _value! : throw exceptionFactory(_error!); // 重写 ToString 用于调试 private string _DebuggerDisplay => IsSuccess ? $"Ok({_value})" : $"Err({_error})"; public override string ToString() => _DebuggerDisplay; // 重写 Equals 和 GetHashCode 以支持比较 public override bool Equals(object? obj) { if (obj is not Result other) return false; if (IsSuccess != other.IsSuccess) return false; return IsSuccess ? EqualityComparer.Default.Equals(_value, other._value) : EqualityComparer.Default.Equals(_error, other._error); } public override int GetHashCode() { return HashCode.Combine(IsSuccess, _value, _error); } }