2个稳定版本
使用旧的Rust 2015
1.0.1 | 2023年7月22日 |
---|
#283 in 无需标准库
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,它提供了一种“通吃”错误类型时,这一点尤为明显,因此你需要转换所有接收到的错误。
当你使用thiserror
或justerror
构建了许多自定义错误,或者使用了许多具有不同错误类型的库时,这也很有帮助。
使用方法
导入特性后,你就可以立即受益
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))?)
}