【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(())  }