11个版本

0.5.0 2024年3月1日
0.4.5 2023年9月15日
0.4.4 2023年4月20日
0.4.3 2023年2月1日
0.1.0 2021年11月29日

#64进程宏

Download history 111/week @ 2024-04-20 99/week @ 2024-04-27 122/week @ 2024-05-04 164/week @ 2024-05-11 136/week @ 2024-05-18 173/week @ 2024-05-25 159/week @ 2024-06-01 83/week @ 2024-06-08 135/week @ 2024-06-15 114/week @ 2024-06-22 59/week @ 2024-06-29 94/week @ 2024-07-06 160/week @ 2024-07-13 96/week @ 2024-07-20 122/week @ 2024-07-27 200/week @ 2024-08-03

582 每月下载次数
22 个crate中使用 (7 直接)

MIT 许可证

47KB
1K SLoC

Syn-Helpers

crates.io badge docs.rs badge

用于在结构体(structenum)上构建 derive proc 宏的框架。

处理

  • 获取引用字段的表达式
  • 为枚举构建模式
  • 为枚举或结构体使用相同的推导逻辑
  • 错误处理和生成 compile_error 输出
  • 在特性和结构体上的泛型(包括冲突纠正)

此crate扩展(并重新导出)了优秀的 synquote crate。

示例

评估每个字段上的 do_thing 函数(预期那些具有 #[ignore] 属性的字段)

use syn_helpers::{
    syn::{parse_quote, DeriveInput, GenericParam, Ident, Stmt}, proc_macro2::Span, quote,
    derive_trait, FieldMut, HasAttributes, Trait, TraitItem, TypeOfSelf, Constructable,
};

let my_trait = Trait {
    name: parse_quote!(::my_crate::MyTrait),
    generic_parameters: None,
    items: vec![TraitItem::new_method(
        Ident::new("method_one", Span::call_site()),
        None,
        TypeOfSelf::Reference,
        Vec::default(),
        None,
        |mut item| {
            item.map_constructable(|mut constructable| {
                Ok(constructable
                    .get_fields_mut()
                    .fields_iterator_mut()
                    .flat_map(|mut field| -> Option<Stmt> {
                        if field
                            .get_attributes()
                            .iter()
                            .any(|attr| attr.path().is_ident("ignore"))
                        {
                            None
                        } else {
                            let reference = field.get_reference();
                            Some(parse_quote!(do_thing(#reference);))
                        }
                    })
                    .collect())
            })
        },
    )],
};

let r#struct: DeriveInput = parse_quote! {
    struct X {
        a: String,
        b: i32
    }
};

let stream = derive_trait(r#struct, my_trait);

assert_eq!(
    stream.to_string(),
    quote! {
        #[automatically_derived]
        impl ::my_crate::MyTrait for X {
            fn method_one(&self) {
                let X { a: ref _0, b: ref _1 } = self;
                do_thing(_0);
                do_thing(_1);
            }
        }
    }.to_string()
)

用于

设计正在进行中

依赖项

~285–730KB
~17K SLoC