5 个版本
0.2.3 | 2023年10月31日 |
---|---|
0.2.2 | 2023年10月31日 |
0.2.1 | 2023年10月31日 |
0.2.0 | 2023年10月31日 |
0.1.0 | 2023年10月26日 |
561 在 Rust 模式
每月157次下载
14KB
180 行
Goof
一个早期可组合和可重用的库,用于编写您自己的小型结构,但实际上您真的不应该这样做。
use goof::{Mismatch, assert_eq};
fn fallible_func(thing: &[u8]) -> Result<(), Mismatch<usize>> {
assert_eq(&32, &thing.len())?;
Ok(())
}
assert_eq!(fallible_func(&[]).unwrap_err(), assert_eq(&32, &0).unwrap_err())
为什么要使用它?它处于预_alpha 阶段,因此目前并不特别有用。但想象一下您不希望在失败的断言上立即 panic 的场景。这些函数可以轻量级地替换标准库的 `assert_eq!` 宏。它不会立即 panic,而是创建一个名为 rust_src_Mismatch 的结构,该结构具有所有适当的特征(除了 std::error::Error
{.verbatim} 因为我想添加 std
{.verbatim} 支持,而不是减少它)实现的。
这些将参与各种好处,不一定依赖于 std
{.verbatim},但可以有效地使 goof
{.verbatim} 成为所有错误处理需求的终点站。它可能像 eyre
{.verbatim} 和 thiserror
{.verbatim} 一样有用,同时提供了一种设计错误 API 的不同方法。
目标
总体 API 决策
- 与
no_std
{.verbatim} 兼容。结构应该易于跨越 FFI 边界使用,行为简单且希望是可预测的。 - 嵌入式友好。我们希望表现得好像我们有一个分配器,同时尽可能将所有结构保持在栈上。
- 所有结构应尽可能尝试实现
Copy
{.verbatim}。 - 尽可能引导用户避免 panic。
- 人体工程学设计。常用的模式应该是简洁的,尽可能容易编写。
- 依赖项少。
- 功能少。
- LTO 友好的代码消除。
支持的使用案例
- 类似于旧
failure
{.verbatim} crate 的上下文错误传播。- 每个错误都可以有一个可选的包装结构,该结构解释上下文并有助于调试。
- 支持 跟踪跨度,以便错误附加了跟踪跨度。
- 不同的错误处理方法
- 快速失败,其中任何失败的断言都立即产生相应的错误并向上传播。
- 完全失败,任何失败都会阻止某些逻辑执行,但会累积错误而不是立即向上传播。
- 可恢复失败,可以应用尝试和捕获特定失败模式的函数来从某些错误条件中恢复,但不能从所有错误条件中恢复。
- 可恢复错误,任何形式的失败都会向上传播到调用栈,但失败可以被纠正,函数可以继续执行。
- 类似
eyre
{.verbatim} 中的格式化打印,以及 (希望) 类似于miette
{.verbatim}。
进度
该库处于早期阶段。我计划从简约的角度来构建,制作一系列 0.*
{.verbatim} 版本,当库完成时,发布 1.0
{.verbatim} 版本。虽然这并不是预发布候选版本,现状下,它应该适用于生产环境,但我建议不要花费太多时间担心新版本的变化。根据您的需要更新,如果这样做,我会提供详细的过渡说明。
更新日志
- 0.1.0
- 对
Mismatch
{.verbatim}、Outside
{.verbatim} 和Unknown
{.verbatim} 结构的初始、极其基本的实现。 - 对
assert_eq
{.verbatim}、assert_in
{.verbatim}、assert_known_enum
{.verbatim} 和assert_known
{.verbatim} 的初始实现。
- 对
- 0.2.0
- 为了提高一致性,在
assert_eq
{.verbatim} 中交换了参数的位置。
- 为了提高一致性,在