【Rust日報】2019-09-17 – 用於向錯誤添加上下文並轉換為自定義錯誤類型的簡單且符合人體工程學的模板
- 2019 年 10 月 5 日
- 筆記
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
:
pub(crate) trait ErrWith<T, E> { fn err_with<W>(self, with: W) -> Result<T, (E, W)>; }
並實例化一個Result
,用Err
有效負載的元組和附加值替換有效負載:
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
以及發生錯誤的路徑:
#[derive(Debug)] enum Error { Io { io_error: io::Error, path: PathBuf }, }
From
impl 將(io::Error, impl AsRef<Path>)
轉化為 Error::Io
:
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)?
為我們的錯誤補全上下文,並將它們轉換為我們的自定義錯誤類型作為結果:
fn main() -> Result<(), Error> { fs::read_to_string("foo/bar").err_with("foo/bar")?; Ok(()) }