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日

1596过程宏 中排名

Download history 1/week @ 2024-04-14 112/week @ 2024-04-21 396/week @ 2024-04-28 25/week @ 2024-05-05 20/week @ 2024-05-12 64/week @ 2024-05-19 46/week @ 2024-05-26 48/week @ 2024-06-02 43/week @ 2024-06-09 41/week @ 2024-06-16 35/week @ 2024-06-23 8/week @ 2024-06-30 20/week @ 2024-07-07 47/week @ 2024-07-14 25/week @ 2024-07-21 66/week @ 2024-07-28

158 每月下载量
13 个crate中(2 直接) 使用

MIT 许可证

40KB
999

描述

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

依赖项

~285–730KB
~17K SLoC