#integration #procmeta-proc #procmeta-core

procmeta

集成 procmeta-core 和 procmeta-proc

19个版本

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.2 2024年2月16日

#126 in 过程宏

Download history 1/week @ 2024-04-14 112/week @ 2024-04-21 386/week @ 2024-04-28 25/week @ 2024-05-05 15/week @ 2024-05-12 57/week @ 2024-05-19 40/week @ 2024-05-26 42/week @ 2024-06-02 39/week @ 2024-06-09 35/week @ 2024-06-16 31/week @ 2024-06-23 7/week @ 2024-06-30 22/week @ 2024-07-07 43/week @ 2024-07-14 20/week @ 2024-07-21 37/week @ 2024-07-28

122 每月下载量
11 个crates(7直接) 中使用

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());
                    }
                }
            }
        }
    }

依赖项

~320–760KB
~18K SLoC