5 个版本
0.2.0 | 2024年3月30日 |
---|---|
0.1.5 | 2021年3月20日 |
0.1.3 | 2020年12月8日 |
0.1.2 | 2020年10月11日 |
#117 in 进程宏
242,269 每月下载
用于 603 个包 (37 直接)
54KB
1K SLoC
derive-syn-parse
: 为 syn
的 Parse
特性提供的派生宏
这是一个相当简单的派生宏,为应用到的类型生成一个 syn::parse::Parse
实现。
编写自定义 syn
解析器时的一个常见模式是重复为输出中的每个字段编写 <name>: input.parse()?
。这个包的 #[derive)]
会为你处理这些,并提供一些有用的额外定制。
用法
使用此包的方法很简单,只需将其添加到您的 'Cargo.toml' 中,并导入派生宏
# Cargo.toml
[dependencies]
derive-syn-parse = "0.2.0"
// your_file.rs
use derive_syn_parse::Parse;
#[derive(Parse)]
struct CustomParsable {
// ...
}
Parse
的派生实现将始终按字段给出的顺序进行解析。有关各种字段属性的详细信息,请参阅 包文档。
此包主要面向已经大量使用 syn
且希望减少所需样板代码量的用户。
动机
在编写大量使用 syn
解析功能 的 Rust 代码时,我们经常会编写类似的内容
use syn::parse::{Parse, ParseStream};
use syn::{Ident, Token, Type};
// A simplified struct field
//
// x: i32
struct MyField {
ident: Ident,
colon_token: Token![:],
ty: Type,
}
impl Parse for MyField {
fn parse(input: ParseStream) -> syn::Result<Self> {
Ok(MyField {
ident: input.parse()?,
colon_token: input.parse()?,
ty: input.parse()?,
})
}
}
这真是太重复了!理想情况下,我们只想简单地 #[derive(Parse)]
并让它工作。我们做到了!(大部分情况下)将 #[derive(Parse)]
添加到之前的结构体中会产生与 Parse
等效的实现。
use syn::{Ident, Token, Type};
use derive_syn_parse::Parse;
#[derive(Parse)]
struct MyField {
ident: Ident,
colon_token: Token![:],
ty: Type,
}
当然,还有更复杂的情况。尽管它们很复杂,但其中许多仍然由提供的各种高级功能所覆盖!更多信息,请参阅 crate 文档。
依赖项
~275–720KB
~17K SLoC