#meta #syn #struct #parse #parser #to-tokens

syn-unnamed-struct

扩展syn表达式和元结构体以支持未命名的结构和元列表

1个不稳定版本

0.1.0 2022年4月3日

#2022过程宏

Download history 128/week @ 2024-03-13 79/week @ 2024-03-20 59/week @ 2024-03-27 63/week @ 2024-04-03 50/week @ 2024-04-10 47/week @ 2024-04-17 69/week @ 2024-04-24 35/week @ 2024-05-01 63/week @ 2024-05-08 59/week @ 2024-05-15 97/week @ 2024-05-22 104/week @ 2024-05-29 64/week @ 2024-06-05 56/week @ 2024-06-12 60/week @ 2024-06-19 45/week @ 2024-06-26

每月244次 下载
用于 derive-from-ext

MIT/Apache

18KB
432

syn_unnamed_struct

解析并转换无名的结构体到tokens。用于属性宏参数中替代Meta属性,以允许使用更结构化的数据(嵌套对象)。

在derive宏定义中的使用

use syn_unnamed_struct::Meta;

#[proc_macro_derive(CustomMacro, attributes(customMacro))]
pub fn derive(tokens: TokenStream) -> TokenStream {
    let input = parse_macro_input!(tokens);
    
    input.attrs.map(|attr| {
        let obj: Meta = attr.parse().expect("Coult not parse attribute");
        
        //can now interact and extract the properties from the Meta enum
        //...
    });
}

宏使用示例

#[derive(CustomMacro)]
#[customMacro(name="something", other={ entry1: "val1", entry2: "val2" })]
struct MyStruct {
    //...
}

支持的属性

  • 未命名的结构体
#[customMacro({ prop1: 123, prop2: 245 })]
  • 嵌套未命名的结构体
#[customMacro({ prop1: 123, prop2: { prop2a: 123, prop2b: 245 } })]
  • Meta值中的未命名的结构体
#[customMacro(prop1=123, prop2={ prop2a: 123, prop2b: 245 })]
  • 未命名的Meta列表
#[customMacro(prop1, prop2, (prop3a=123, prop3b=245)))]
  • 嵌套未命名的Meta列表
#[customMacro(prop1=123, prop2=(prop2a=123, prop2b=245)))]

注意

  • 由于与syn Meta结构体交织在一起,不能使用darling

依赖

~1.5MB
~35K SLoC