diff options
| author | HampusM <hampus@hampusmat.com> | 2026-06-16 19:07:36 +0200 |
|---|---|---|
| committer | HampusM <hampus@hampusmat.com> | 2026-06-16 19:20:17 +0200 |
| commit | c79f7883c099f1624f9666fb8691ffc5022c1bf5 (patch) | |
| tree | dd3c4689377d178d1efa993fb2c21d2cc733f49f /engine-macros/src/reflection/default_value.rs | |
| parent | 166da477e761416a87ffd5fb8fc49ceaf7f53690 (diff) | |
Diffstat (limited to 'engine-macros/src/reflection/default_value.rs')
| -rw-r--r-- | engine-macros/src/reflection/default_value.rs | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/engine-macros/src/reflection/default_value.rs b/engine-macros/src/reflection/default_value.rs new file mode 100644 index 0000000..567c3b1 --- /dev/null +++ b/engine-macros/src/reflection/default_value.rs @@ -0,0 +1,42 @@ +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<T>(std::marker::PhantomData<T>); + + trait HasDefaultValue + { + fn default_value_fn(&self) -> Option<fn() -> Box<dyn std::any::Any>>; + } + + trait NoDefaultValue + { + fn default_value_fn(&self) -> Option<fn() -> Box<dyn std::any::Any>>; + } + + impl<T> NoDefaultValue for &SpecializationTarget<T> + { + fn default_value_fn(&self) -> Option<fn() -> Box<dyn std::any::Any>> + { + None + } + } + + impl<T> HasDefaultValue for SpecializationTarget<T> + where + T: std::default::Default + 'static + { + fn default_value_fn(&self) -> Option<fn() -> Box<dyn std::any::Any>> + { + Some(|| Box::new(T::default())) + } + } + + (&SpecializationTarget::<#type_ident #type_generics>(std::marker::PhantomData)) + .default_value_fn() + } +} |
