18个版本

0.3.5 2024年5月3日
0.3.4 2024年5月3日
0.3.2 2024年4月27日
0.2.9 2024年3月31日
0.1.1 2024年2月16日

#1536过程宏

Download history 1/week @ 2024-04-14 111/week @ 2024-04-21 392/week @ 2024-04-28 25/week @ 2024-05-05 17/week @ 2024-05-12 59/week @ 2024-05-19 43/week @ 2024-05-26 45/week @ 2024-06-02 41/week @ 2024-06-09 38/week @ 2024-06-16 33/week @ 2024-06-23 7/week @ 2024-06-30 21/week @ 2024-07-07 45/week @ 2024-07-14 24/week @ 2024-07-21 49/week @ 2024-07-28

139 每月下载
12 个crate中(通过 procmeta)使用

MIT 许可证

5KB

描述

用于Rust过程宏开发辅助工具包

使用

派生宏 GetTokenStream

用于生成获取该类型值的token stream,例如:

    #[test]
    fn test_token_stream() {
        #[derive(GetTokenStream)]
        pub enum Ass {
            S(Student),
        }

        #[derive(GetTokenStream)]
        pub struct Student {
            pub name: String,
            pub age: i32,
        }
        let student = Student {
            name: "lloyd".to_string(),
            age: 18,
        };

        let a = Ass::S(student);
        println!("{}", a.get_token_stream());
    }

输出结果为: Ass :: S (Student { name : "lloyd" . into () , age : 18i32 , } ,)

派生宏 MetaParser

用于解析宏辅助参数,将参数元数据解析为特定的枚举

  • 指定解析的参数名称使用[name]进行标注
  • 元组项的类型没有实现parse stream时,可使用[converter]进行转换
  • 带名的结构体使用类型的FromMetaExpr实现,调用try_from_expr方法进行获取,例如:
    #[test]
    fn test_meta_parser() {
        #[derive(MetaParser)]
        enum Context {
            #[name("note")]
            Note(#[converter(LitStr)] String),

            #[name("note")]
            NoteNameSize { name: LitStr, size: LitInt },

            #[name("note")]
            NoteName { name: LitStr },
        }

        let input: ItemStruct = parse_quote! {
            #[note("111")]
            #[note(name = "222", size = 18)]
            #[note(name = "333")]
            pub struct MyStruct {
                pub name: String,
            }
        };
        let attrs = input.attrs;
        for attr in attrs {
            let context = Context::parse(&attr.meta);
            if let Ok(context) = context {
                match context {
                    Context::Note(name) => {
                        println!("{}", name);
                    }
                    Context::NoteNameSize { name, size } => {
                        println!(
                            "name = {}, size = {}",
                            name.value(),
                            size.base10_parse::<i64>().unwrap()
                        );
                    }
                    Context::NoteName { name } => {
                        println!("name = {}", name.value());
                    }
                }
            }
        }
    }

依赖项

~300–740KB
~18K SLoC