use proc_macro::TokenStream; use quote::quote; use syn::{parse::Parser, parse_macro_input, DeriveInput}; #[proc_macro_attribute] pub fn uses_base_template(_attr: TokenStream, item: TokenStream) -> TokenStream { let mut input = parse_macro_input!(item as DeriveInput); let base_template_field = syn::Field::parse_named .parse2( quote! { pub base_template: BaseTemplate } .into(), ) .unwrap(); match &mut input.data { syn::Data::Struct(ref mut struct_data) => { match &mut struct_data.fields { syn::Fields::Named(fields) => { fields.named.push(base_template_field); } _ => (), } return quote! { #input } .into(); } _ => { panic!("bad") } }; }