Skip to main content

struct_patch_derive/
lib.rs

1extern 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