1个不稳定版本

0.1.0 2024年8月3日

#1675Rust模式

Download history 93/week @ 2024-07-29 20/week @ 2024-08-05

每月113次下载

MIT 许可证

34KB
275

ocm

ocmcrate提供Outcome<T, E>,一种用于模拟在始终返回一些值的同时可能产生多个错误的操作的舒适类型。

这对于像解析这样的操作很有用,您可能希望在失败之前收集尽可能多的错误。

use ocm::{Outcome, ErrorCollector};

// Some operation which always returns a value, but may produce errors while doing so
pub fn sum_ints<'a>(input: &[&'a str]) -> Outcome<u32, String> {
    Outcome::build(|errors| {
        let mut sum = 0;

        for item in input {
            match item.parse::<u32>() {
                Ok(num) => sum += num,
                Err(_) => errors.push_error(format!("not a number: {item}")),
            }
        }

        sum
    })
}

let outcome = sum_ints(&["123", "456", "abc", "789", "def"]);

// `Outcome::finalize` breaks the outcome into:
//   - The value
//   - An `ErrorSentinel`, which dynamically ensures that errors are handled
let (value, errors) = outcome.finalize();
println!("Sum value: {value}");
if errors.any() {
    println!("Errors:");
    for err in errors.into_errors_iter() {
        println!("  - {err}");
    }
}

只是将值和错误捆绑在一起,可能会使错误意外被忽略。我们希望确保错误得到适当的处理。

不幸的是,Rust缺乏进行此类静态操作的线性类型系统,因此它是在运行时完成的,使用panic来指示未处理就丢弃的错误。

use ocm::Outcome;

let outcome = Outcome::new_with_errors(42, vec!["error 1", "error 2"]);
let (value, errors) = outcome.finalize();

println!("Value: {value}");
// Whoops! `errors` was never handled - this will panic.

无运行时依赖