#variant #parse #enums #macro-derive #parser #either

parse-variants

为枚举派生 syn::parse::Parse 特性,并使用它轻松解析枚举的变体

6个版本 (稳定)

1.0.3 2024年7月27日
1.0.2 2024年7月23日
1.0.1 2023年3月20日
0.1.1 2021年6月12日
0.1.0 2021年6月10日

#48过程宏

Download history 543/week @ 2024-04-27 414/week @ 2024-05-04 415/week @ 2024-05-11 287/week @ 2024-05-18 329/week @ 2024-05-25 352/week @ 2024-06-01 313/week @ 2024-06-08 675/week @ 2024-06-15 545/week @ 2024-06-22 650/week @ 2024-06-29 618/week @ 2024-07-06 524/week @ 2024-07-13 1265/week @ 2024-07-20 1134/week @ 2024-07-27 886/week @ 2024-08-03 481/week @ 2024-08-10

每月下载量 3,874
69 个crate中使用 (6 个直接使用)

MIT 协议

19KB
225

parse-variants

build lints tests approval-tests maintenance-status

为枚举派生 syn::parse::Parse 特性,并使用它轻松解析枚举的变体。

支持

如果你喜欢这个crate,推荐给其他人。如果你愿意,你也可以 买我一杯咖啡

动机

为了一个小项目,我试图从一个 ParseBuffer 解析可以是整型字面量或标识符的标记。这激发了我编写自定义派生宏的想法。现在我们可以这样写

#[derive(parse_variants::Parse)]
enum Number {
    Identifier(syn::Ident),
    Literal(syn::LitInt),
}

然后使用此类型从解析缓冲区解析任意变体,如下所示

// input : &ParseBuffer
let num : Number = input.parse()?;

此操作返回从解析缓冲区内容中可以成功解析的第一个变体(按声明顺序)。如果没有变体可以解析,则返回编译错误。我们可以在任何希望解析此类型的环境中使用此功能。自定义派生宏也可以用于更通用的 enum 类型,从而实现强大的变体类型解析。

高级用例

枚举不必像上面的例子那样简单,因为这个crate允许您在具有类似结构体或元组的变体(或它们的任何组合)的枚举上使用自定义派生。请参阅以下更高级的用例

mod kw {
    syn::custom_keyword!(meters);
}

#[derive(parse_variants::Parse)]
enum SillyEnum {
    ExpressionInMeters {
        first: syn::Expr,
        _meters: kw::meters,
    },
    IdentPlusPlus(Ident, syn::Token![+], syn::Token![+]),
}

这解析了 16 + 12*长度米 作为第一个变体和 C++ 作为第二个变体。

请参阅crate文档以获取有关如何使用此宏以及需要注意什么的更多信息。

依赖项

~280–730KB
~18K SLoC