#evitable #error #syn #enums #token #calling #string

evitable-syn-meta-ext

evitable-derive-core 使用的 syn 元数据助手

6 个版本 (破坏性更改)

0.5.0 2019年11月28日
0.4.0 2019年11月5日
0.3.0 2019年9月8日
0.2.0 2019年7月19日
0.1.1 2019年7月18日

#38#calling

每月 26 次下载
3 个crate中使用(通过 evitable-derive-core

MIT 许可证

47KB
1.5K SLoC

Evitable

Crate Documentation Build Status

Evitable 是一个用于在库中轻松创建和使用自定义错误类型的库。它的目的是使创建特定领域的自定义错误类型更加容易,同时减少从底层错误转换为特定领域错误相关的噪声,同时保持底层错误作为 source()。此crate默认启用名为 derive 的功能,该功能启用 derive ErrorContexts。

快速示例

此示例展示了调用某个API的典型用例,该API(假装)读取文件,然后失败,并将错误转换为特定领域错误。

use evitable::*;

// Typically, this is in another file
mod error {
  use super::*;

  #[evitable]
  pub enum ParseContext {
    #[evitable(description = "Io error", from = std::io::Error)]
    Io,

    #[evitable(description("Invalid token. Expected {}, was {}.", expected, actual))]
    InvalidToken {
       expected: String,
       actual: String,
    },
  }
}

use error::*;

// pretend token type
#[derive(Debug)]
pub enum Token {
  EndOfFile,
}

fn read_file() -> Result<String, std::io::Error> {
  // we're pretending to read a file here
  Err(std::io::Error::from(std::io::ErrorKind::NotFound))
}

// main function
fn parse_file() -> ParseResult<Token> {
  let content = read_file()?;
  ensure!(content == "EOF", ParseContext::InvalidToken {
    expected: "EOF".to_owned(),
    actual: content,
  });

  Ok(Token::EndOfFile)
}

let result = parse_file();
let err = result.unwrap_err();
assert_eq!(err.kind(), ParseErrorKind::Io);

依赖关系

~1.5MB
~36K SLoC