extern crate proc_macro; use proc_macro::TokenStream; use quote::quote; use syn::{parse_macro_input, DeriveInput}; #[proc_macro_derive(ConfigOption)] pub fn derive(input: TokenStream) -> TokenStream { let DeriveInput { ident, .. } = parse_macro_input!(input as DeriveInput); let result = quote! { impl From<&Config> for Option<#ident> { fn from(config: &Config) -> Self { match config.values.get(&ConfigName::#ident) { Some(ConfigOption::#ident(val)) => Some(val.clone()), _ => None, } } } }; result.into() }