1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
use proc_macro; use proc_macro::*; use quote::quote; use syn::{parse_macro_input, Data, DataStruct, DeriveInput, Fields}; #[proc_macro_derive(Substitutions)] pub fn template_derive(input: TokenStream) -> TokenStream { let input = parse_macro_input!(input as DeriveInput); let struct_name = input.ident; if let Data::Struct(DataStruct { fields: Fields::Named(fields), .. }) = &input.data { let names = fields .named .iter() .map(|field| field.ident.as_ref().unwrap()); (quote! { impl microtemplate::Context for #struct_name<'_> { fn get_field(&self, field_name: &str) -> &str { match field_name { #( stringify!(#names) => &self.#names, )* _ => "", } } } }) .into() } else { panic!("Expected struct with named fields.") } }