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 在 过程宏
每月下载量 3,874
在 69 个crate中使用 (6 个直接使用)
19KB
225 行
parse-variants
为枚举派生 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