#failure #outcome #result #eyre #derive-debug

无 std 结果-46f94afc-026f-5511-9d7e-7d1fd495fb5c

错误传播增强

2 个版本

0.1.1 2022 年 7 月 12 日
0.1.0 2022 年 1 月 16 日
0.0.2 2022 年 1 月 16 日
0.0.1 2022 年 1 月 16 日
0.0.0 2021 年 7 月 20 日

#1023 in Rust 模式

MIT 许可证

98KB
1.5K SLoC

概述

Audit Pull Request codecov Documentation

Outcome<S, M, F> 是 Rust 标准库中找到的 Result 类型的增强。

它是一个枚举,具有以下变体

  • Success(S),表示成功并包含一个值
  • Mistake(M),表示一个可选的 可重试错误 并包含一个值
  • Failure(F),表示失败并包含一个值。
enum Outcome<S, M, F> {
  Success(S),
  Mistake(M),
  Failure(F),
}

OutcomeResult 的一个 增强。它向 "成功或失败" 的二分法添加了第三个状态,这是 Result<T, E> 模型所不具备的。这个第三个状态是 可重试 错误的状态。一个 可重试 错误是指由于其他操作(例如,磁盘读写未完成)、配置错误(例如,在调用函数之前忘记设置特定标志)或忙碌的资源(例如,尝试锁定音频、视频或数据库资源)而导致操作可能没有成功。

use outcome::prelude::*;

#[derive(Debug, PartialEq)]
enum Version { V1, V2 }

#[derive(Debug, PartialEq)]
struct EmptyInput;

fn parse_version(header: &[u8]) -> Outcome<Version, EmptyInput, &'static str> {
  match header.get(0) {
    None => Mistake(EmptyInput),
    Some(&1) => Success(Version::V1),
    Some(&2) => Success(Version::V2),
    Some(_) => Failure("invalid or unknown version"),
  }
}

let version = parse_version(&[]);
assert_eq!(version, Mistake(EmptyInput));

用法

目前,在crates.io上已经有人使用了名称outcome。由于crates.io目前不支持命名空间或集合,我们不得不采取一种独特的方法来发布这个crate。为此,我们通过python生成了一个UUIDv5字符串。

from uuid import *
print(uuid5(uuid5(NAMESPACE_DNS, "occult.work"), "outcome"))

这将生成字符串46f94afc-026f-5511-9d7e-7d1fd495fb5c。因此,您的Cargo.toml中的依赖项将看起来像这样

[dependencies]
outcome-46f94afc-026f-5511-9d7e-7d1fd495fb5c = "*"

然而,导出的库名称仍然是outcome,因此导入它的处理方式相同

use outcome::prelude::*;

用户也可以通过在他们的依赖声明中使用package键来解决这个问题

[dependencies.outcome]
version = "*"
package = "outcome-46f94afc-026f-5511-9d7e-7d1fd495fb5c"

这个解决方案对用户友好吗?不,但crates.io上的命名空间缺失和域名抢注政策也同样不友好。如果/当这个问题得到解决时,这个crate的文档(和名称!)将被更改,所有版本都将被撤回。

依赖项

~0-285KB