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

Download history 65035/week @ 2024-05-03 70578/week @ 2024-05-10 71112/week @ 2024-05-17 76396/week @ 2024-05-24 89873/week @ 2024-05-31 88480/week @ 2024-06-07 75102/week @ 2024-06-14 80395/week @ 2024-06-21 84890/week @ 2024-06-28 84875/week @ 2024-07-05 90422/week @ 2024-07-12 86034/week @ 2024-07-19 90303/week @ 2024-07-26 82811/week @ 2024-08-02 103190/week @ 2024-08-09 124215/week @ 2024-08-16

419,457 每月下载量
用于 247 个crate(18个直接使用)

MIT/Apache

67KB
1K SLoC

attribute-derive

docs.rs lib.rs MIT Documentation for main

基本类似于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 有多种方式。

对于辅助属性有

解析单个 TokenStream,例如解析 proc 宏输入,有两种方式

依赖项

~0.7–1.2MB
~24K SLoC