struct_patch_derive/
lib.rs1extern crate proc_macro;
2mod filler;
3mod patch;
4
5use filler::Filler;
6use patch::Patch;
7
8use syn::meta::ParseNestedMeta;
9use syn::spanned::Spanned;
10use syn::Error;
11
12#[cfg(feature = "op")]
13pub(crate) enum Addable {
14 Disable,
15 AddTrait,
16 AddFn(proc_macro2::Ident),
17}
18
19#[proc_macro_derive(Patch, attributes(patch))]
20pub fn derive_patch(item: proc_macro::TokenStream) -> proc_macro::TokenStream {
21 Patch::from_ast(syn::parse_macro_input!(item as syn::DeriveInput))
22 .unwrap()
23 .to_token_stream()
24 .unwrap()
25 .into()
26}
27
28#[proc_macro_derive(Filler, attributes(filler))]
29pub fn derive_filler(item: proc_macro::TokenStream) -> proc_macro::TokenStream {
30 Filler::from_ast(syn::parse_macro_input!(item as syn::DeriveInput))
31 .unwrap()
32 .to_token_stream()
33 .unwrap()
34 .into()
35}
36
37fn get_lit(attr_name: String, meta: &ParseNestedMeta) -> syn::Result<Option<syn::Lit>> {
38 let expr: syn::Expr = meta.value()?.parse()?;
39 let mut value = &expr;
40 while let syn::Expr::Group(e) = value {
41 value = &e.expr;
42 }
43 if let syn::Expr::Lit(syn::ExprLit { lit, .. }) = value {
44 Ok(Some(lit.clone()))
45 } else {
46 Err(Error::new(
47 expr.span(),
48 format!(
49 "expected serde {} attribute to be lit: `{} = \"...\"`",
50 attr_name, attr_name
51 ),
52 ))
53 }
54}
55