#error #error-handling #no-alloc

no-std err-into

扩展了core::convert::Into特性,用于与Results和Options一起使用

2个稳定版本

使用旧的Rust 2015

1.0.1 2023年7月22日

#283 in 无需标准库

MIT 许可证

7KB

错误Into

扩展了core::convert::Into特性,允许Result和Option直接转换其包含的值。

使用方法

导入特性即可

use err_into::*;
// use err_into::MapInto;    // .map(Into::into)                     -> .map_into()
// use err_into::ErrorInto;  // .map_err(Into::into)                 -> .err_into()
// use err_into::ResultInto; // .map(Into::into).map_err(Into::into) -> .res_into()

查看文档获取更多信息。


lib.rs:

一个无需std的库,用于简化返回Result时的方法链式调用。这是一个与所有环境兼容的简单库。

当使用如anyhow这样的crate,它提供了一种“通吃”错误类型时,这一点尤为明显,因此你需要转换所有接收到的错误。

当你使用thiserrorjusterror构建了许多自定义错误,或者使用了许多具有不同错误类型的库时,这也很有帮助。

使用方法

导入特性后,你就可以立即受益

use err_into::MapInto;
use err_into::ErrorInto;
use err_into::ResultInto;

// ...

let _: Option<i32> = Some(0u8).map_into();
let _: Result<i32, ()> = Ok(0u8).map_into();
let _: Result<(), i32> = Err(0u8).err_into();
let _: Result<u16, i32> = (if false { Ok(0u8) } else { Err(0i8) }).res_into();

动机示例

这个例子稍微有些牵强,因为我不想依赖任何库,但它展示了err_into的强大之处

use err_into::ErrorInto;

fn process(val: u16) -> Result<u8, u8> {
    if val > 255 {
        Err((val >> 8) as u8)
    } else {
        Ok(val as _)
    }
}

fn long_chain() -> Result<u8, i32> {
    (0u16..16u16).map(|x| x * x * x * x)
        .filter(|x| x % 2 == 0)
        .map(process)
        .next()
        .unwrap_or(Err(0))
        .err_into()
}

fn long_chain_no_err_into() -> Result<u8, i32> {
    // May be confusing
    (0u16..16u16).map(|x| x * x * x * x)
        .filter(|x| x % 2 == 0)
        .map(process)
        .next()
        .unwrap_or(Err(0))
        .map_err(Into::into)
}

fn long_chain_no_map_err() -> Result<u8, i32> {
    // Please don't do this
    Ok((0u16..16u16).map(|x| x * x * x * x)
        .filter(|x| x % 2 == 0)
        .map(process)
        .next()
        .unwrap_or(Err(0))?)
}

无运行时依赖