2 个版本

0.1.1 2021 年 9 月 4 日
0.1.0 2021 年 8 月 25 日

1643Rust 模式

MIT 许可证

5KB

codespan-derive

用于从错误宏优雅地创建诊断的 derive 宏

使用方法

  1. #[derive(IntoDiagnostic)] 添加到您的错误宏类型上。
  2. 添加 #[file_id(Type)] 以指示 Diagnostic 的 FileId 泛型类型。
  3. 为每个变体添加 #[message = ""] 以指示错误消息应如何读取。
  4. 实现 IntoLabel 的类似于 Span 的值可以标记为 #[primary]#[secondary] 以在生成的错误中标记,可选的消息如 #[primary = ""]
#[derive(IntoDiagnostic)]
#[file_id(SomeFileIdType)]
enum Error {
  #[message = "Compiler found the number `{0}` is too large"]
  NumberTooLarge(usize),

  #[message = "Cannot parse string {string}"]
  BadString {
    string: String,
    #[primary = "The bad string appears here"]
    span: Span,
  },
}

然后在某处处理它,如下所示

if let Some(err) = result {
  // IntoDiagnostic derived from macro
  let diagnostic = err.into_diagnostic();

  // Basic codespan-diagnostic printing to terminal
  let writer = StandardStream::stderr(ColorChoice::Always);
  let config = codespan_reporting::term::Config::default();
  term::emit(&mut writer.lock(), &config, &files, &diagnostic)?;
}

依赖

~1.8–9.5MB
~82K SLoC