【Rust日报】2019-09-17 - 用于向错误添加上下文并转换为自定义错误类型的简单且符合人体工程学的模板

2019-09-19 17:35:15 浏览数 (1)

Rants:异步NATS客户端库

Rants是一个使用async/ await 语法和新的异步生态系统的异步NATS客户端库。

配置直接处理消息的NATS客户端协议基础设施(与低级解析细节相反)十分的简单。此库的作者曾经用nom编写过底层解析器并将其集成到一个自定义的 tokio::codec::Decoder中。新的编解码器提供了一个用于处理来自NATS服务器的所有传入消息的高级流。

更多信息前往GitHub。

Rust伦敦社区9月MeetUp

Hi Rustaceans,

LDN Meetup将于9月24日在伦敦举行。参与详情请点击:https://www.meetup.com/Rust-London-User-Group/events/264890481/attendees/

Babylon Health为现场提供的比萨和啤酒,期待在那里见到你们。

Rust / wasm数据 / 内存共享

wasm-bindgen是一个Rust库和CLI工具,它促进了wasm模块和JavaScript之间的高级交互。wasm-bindgen 工具和库都是Rust和WebAssembly生态系统的一部分。

wasm-bindgen工具有点半填充性质,用于主机绑定等功能,以及用于增强JS和wasm编译代码(目前主要来自Rust)之间高级交互的部分功能。更具体地说,这个项目能让JS / wasm与字符串、JS对象、类等事物之间进行通信,而不是纯粹的传递整数和浮点数。

点击这里了解更多。

用于向错误添加上下文并转换为自定义错误类型的简单且符合人体工程学的模板

经过一系列实验,这已经是一个很好的模板,下面我们就开始用它来补全自定义错误类型的上下文。

首先,我们使用单个方法定义特征, err_with

代码语言:javascript复制
pub(crate) trait ErrWith<T, E> {
    fn err_with<W>(self, with: W) -> Result<T, (E, W)>;
}

并实例化一个Result,用Err有效负载的元组和附加值替换有效负载:

代码语言:javascript复制
impl<T, E> ErrWith<T, E> for Result<T, E> {
    fn err_with<W>(self, with: W) -> Result<T, (E, W)> {
        match self {
            Ok(ok) => Ok(ok),
            Err(error) => Err((error, with)),
        }
    }
}

然后,我们可以使用From实现我们的自定义错误类型,不同的元组类型映射到不同的错误变体。这是一个自定义错误类型,其中包含一个Io变量,io::Error以及发生错误的路径:

代码语言:javascript复制
#[derive(Debug)]
enum Error {
    Io { io_error: io::Error, path: PathBuf },
}

From impl 将(io::Error, impl AsRef<Path>)转化为 Error::Io:

代码语言:javascript复制
impl<P: AsRef<Path>> From<(io::Error, P)> for Error {
    fn from((io_error, path): (io::Error, P)) -> Error {
        Error::Io {
            path: path.as_ref().to_owned(),
            io_error,
        }
    }
}

我们可以用来.err_with(path)?为我们的错误补全上下文,并将它们转换为我们的自定义错误类型作为结果:

代码语言:javascript复制
fn main() -> Result<(), Error> {
    fs::read_to_string("foo/bar").err_with("foo/bar")?;
    Ok(())
}

0 人点赞