#proc-macro #macro #light-weight

proclet

使过程宏变得简单

3个版本 (破坏性更新)

0.3.0 2024年3月21日
0.2.0 2024年2月17日
0.1.0 2024年2月16日

#234 in 过程宏

每月25次下载
3 crate 中使用

MIT OR Apache-2.0 OR Zlib

145KB
3K SLoC

proclet: 使过程宏变得简单

⚠️ proclet 还处于早期开发阶段。它缺少一些基本功能,并且可能会进行重大设计更改,文档仍在进行中。

proclet 可以与 proc-macro 或 proc-macro2 或两者一起使用。proc-macro crate的大多数类型都被抽象为trait,而 proclet 的类型对这些trait是通用的。如果您遇到类型推断问题,可以在 pm1pm2 模块中找到 proclet 类型特定的别名。

下面是如何创建一个接受一组以逗号分隔的字符串作为参数的过程宏(最后一个逗号可选)

#[proc_macro]
pub fn my_proc_macro(input: TokenStream) -> TokenStream {
    proclet(input, |input| {
        let args = punctuated(StringLiteral::parser(), op(",")).parse_all(input)?;
        // ...
    })
}

proclet 函数是一个可选的包装器,它将输入转换为准备解析的 TokenBuf,将输出转换回 TokenStream,并通过创建漂亮的带有span的编译器错误来处理错误,而不是panic。

parse_all 如果在解析后缓冲区中还有令牌,则返回错误。要为下一个解析器留出缓冲区的其余部分,请使用 parse 方法。

您可以组合解析器来解析更复杂的对象,如上面示例中的 punctuated 所做的那样。实现了 Parse trait的类型可以直接解析

let string = StringLiteral::parse(input)?;

如果成功,input 将自动前进到指向已解析对象的点。

依赖项