18个版本 (9个重大更新)
0.10.0 | 2024年8月13日 |
---|---|
0.9.2 | 2024年6月22日 |
0.9.1 | 2024年3月23日 |
0.8.1 | 2023年9月27日 |
0.2.2 | 2022年2月12日 |
#22 in 过程宏
419,457 每月下载量
用于 247 个crate(18个直接使用)
67KB
1K SLoC
attribute-derive
基本类似于clap的属性宏
use attribute_derive::Attribute;
use syn::Type;
#[derive(Attribute)]
#[attribute(ident = collection)]
#[attribute(error(missing_field = "`{field}` was not specified"))]
struct CollectionAttribute {
// Options are optional by default (will be set to None if not specified)
authority: Option<String>,
name: String,
// Any type implementing default can be flagged as default
// This will be set to Vec::default() when not specified
#[attribute(optional)]
views: Vec<Type>,
// Booleans can be used without assigning a value, i.e., as a flag.
// If omitted they are set to false
some_flag: bool,
}
能够解析如下属性
#[collection(authority="Some String", name = r#"Another string"#, views = [Option, ()])]
局限性
在语法解析方面存在一些局限性,将在未来的版本中解决。
- 顶层字面量(意味着类似
#[attr(42, 3.14, "hi")]
- 函数式参数(类似
#[attr(view(a = "test"))]
- 其他语法,可能类似
key: value
解析方法
解析结构化派生 Attribute
有多种方式。
对于辅助属性有
Attribute::from_attributes
接收一个IntoIterator<Item = &'a syn::Attribute
(例如,一个&Vec<syn::Attribute>
)。对于 derive 宏非常有用。Attribute::remove_attributes
接收一个&mut Vec<syn::Attribute>
,不仅解析Attribute
,还会移除匹配的项。对于 proc 宏的辅助属性非常有用,其中辅助属性需要被移除。
解析单个 TokenStream
,例如解析 proc 宏输入,有两种方式
Attribute::from_args
接收一个TokenStream
- 由于
derive(Attribute)
也派生了Parse
,所以可以使用 parse API,例如使用parse_macro_input!(tokens as Attribute)
。
依赖项
~0.7–1.2MB
~24K SLoC