use quote::quote; pub fn gen_get_default_value_fn( type_ident: &proc_macro2::Ident, type_generics: &syn::TypeGenerics, ) -> proc_macro2::TokenStream { quote! { struct SpecializationTarget(std::marker::PhantomData); trait HasDefaultValue { fn default_value_fn(&self) -> Option Box>; } trait NoDefaultValue { fn default_value_fn(&self) -> Option Box>; } impl NoDefaultValue for &SpecializationTarget { fn default_value_fn(&self) -> Option Box> { None } } impl HasDefaultValue for SpecializationTarget where T: std::default::Default + 'static { fn default_value_fn(&self) -> Option Box> { Some(|| Box::new(T::default())) } } (&SpecializationTarget::<#type_ident #type_generics>(std::marker::PhantomData)) .default_value_fn() } }