#proc-macro #error #spans #spanned #generated #enums #struct

error_spanned

生成围绕实现std::error::Error的枚举的包装结构和宏。生成的宏可用于将行、文件和范围信息添加到枚举的错误中。这旨在在过程宏库中使用。

1个不稳定版本

0.1.0 2021年6月15日

#1800过程宏

MIT/Apache

8KB

error_spanned

此crate旨在在过程宏库中使用。

此crate提供了一个trait ErrorSpanned 和一个 derive 宏 error_spanned_derive::ErrorSpanned。该trait强制错误类型支持转换为 syn::Errorproc_macro2::TokenStream

此trait由由 #[derive(ErrorSpanned)] 生成的包装结构实现。该结构存储行、文件和范围信息。

示例

对于名为 error_spanned.rs 的文件

use std::fmt::Display;
use error_spanned::{ErrorSpanned as _, ErrorSpanned};
use proc_macro2::Span;

// Deriving ErrorSpanned generates a struct named `CustomErrorSpanned`
// and a function-like macro named custom_error!().
#[derive(Debug, ErrorSpanned)]
enum CustomError {
    Error1,
    Error2(String),
    Error3 {
        x: i32,
        y: i32,
    },
}

impl Display for CustomError {
    fn fmt(&self, f: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> {
        match self {
            CustomError::Error1 => write!(f, "Error1"),
            CustomError::Error2(string) => write!(f, "Error2({})", string),
            CustomError::Error3 {x, y} => write!(f, "Error3 {{ x = {}, y = {} }}",x, y),
        }
    }
}
impl std::error::Error for CustomError {}

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // Printing the following errors will also print line and file
    println!("{}", custom_error!(Error1, Span::call_site()));
    println!("{}", custom_error!(Error2("Hello world".into()), Span::call_site()));
    println!("{}", custom_error!(Error3{x: 1, y: 2}, Span::call_site()));
    Ok(())
}

输出如下

Line: 31, File: /Users/mihir/rust_crates/error_spanned/tests/error_spanned.rs:
Error1
Line: 32, File: /Users/mihir/rust_crates/error_spanned/tests/error_spanned.rs:
Error2(Hello world)
Line: 33, File: /Users/mihir/rust_crates/error_spanned/tests/error_spanned.rs:
Error3 { x = 1, y = 2 }

如上例所示,错误应通过生成的宏(如 custom_error!())传播。生成的宏是错误枚举的蛇形版本。

生成的宏接受错误变体(不是完整路径)作为第一个参数,范围作为第二个参数。

宏返回的类型是 <enum_named>Spanned。此类型可以实现 proc_macro2::TokenStreamsyn::Error,因为它实现了 ErrorSpanned。在转换为 proc_macro2::TokenStreamsyn::Error 时,它保留范围信息。

依赖关系

~1.5MB
~36K SLoC