#error #composable #reusable #friendly #std #pre-alpha #assert-eq

bin+lib goof

一个可重用、可组合、聚合的、对 no_std 友好的错误库

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日

561Rust 模式

Download history 33/week @ 2024-03-30 57/week @ 2024-04-06 13/week @ 2024-04-13 117/week @ 2024-04-20 117/week @ 2024-04-27 39/week @ 2024-05-04 58/week @ 2024-05-11 10/week @ 2024-05-18 30/week @ 2024-05-25 47/week @ 2024-06-01 43/week @ 2024-06-08 69/week @ 2024-06-15 29/week @ 2024-06-22 3/week @ 2024-06-29

每月157次下载

Apache-2.0

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} 中交换了参数的位置。

无运行时依赖