use quote::quote; pub fn gen_get_default_value_fn( type_ident: &proc_macro2::Ident, generic_args: Option<&syn::AngleBracketedGenericArguments>, ) -> 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 #generic_args>(std::marker::PhantomData)) .default_value_fn() } }