#parse #syn #macro-derive #traits #proc-macro #parse-input #token

进程宏 derive-syn-parse

syn::parse::Parse 提供的派生宏

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 进程宏

Download history 86853/week @ 2024-04-15 83580/week @ 2024-04-22 62462/week @ 2024-04-29 65441/week @ 2024-05-06 76498/week @ 2024-05-13 73083/week @ 2024-05-20 87305/week @ 2024-05-27 76465/week @ 2024-06-03 66738/week @ 2024-06-10 69300/week @ 2024-06-17 85054/week @ 2024-06-24 72491/week @ 2024-07-01 56996/week @ 2024-07-08 64479/week @ 2024-07-15 63325/week @ 2024-07-22 54684/week @ 2024-07-29

242,269 每月下载
用于 603 个包 (37 直接)

MIT/Apache

54KB
1K SLoC

crates.io docs.rs

derive-syn-parse: 为 synParse 特性提供的派生宏

这是一个相当简单的派生宏,为应用到的类型生成一个 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