diff options
Diffstat (limited to 'mingling_macros/src/derive/grouped.rs')
| -rw-r--r-- | mingling_macros/src/derive/grouped.rs | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/mingling_macros/src/derive/grouped.rs b/mingling_macros/src/derive/grouped.rs new file mode 100644 index 0000000..307aab6 --- /dev/null +++ b/mingling_macros/src/derive/grouped.rs @@ -0,0 +1,79 @@ +use proc_macro::TokenStream; +use quote::quote; +use syn::{DeriveInput, Ident, parse_macro_input}; + +pub(crate) fn derive_grouped(input: TokenStream) -> TokenStream { + // Parse the input struct/enum + let input = parse_macro_input!(input as DeriveInput); + let struct_name = input.ident; + + let group_ident: proc_macro2::TokenStream = crate::default_program_path(); + + let any_output_convert_impls = + proc_macro2::TokenStream::from(build_any_output_convert_impls(&struct_name, &group_ident)); + + // Generate the Grouped trait implementation + let expanded = quote! { + ::mingling::macros::register_type!(#struct_name); + + impl ::mingling::Grouped<#group_ident> for #struct_name { + fn member_id() -> #group_ident { + #group_ident::#struct_name + } + } + + #any_output_convert_impls + }; + + expanded.into() +} + +#[cfg(feature = "structural_renderer")] +pub fn derive_grouped_serialize(input: TokenStream) -> TokenStream { + // Parse the input struct/enum + let input_parsed = parse_macro_input!(input as DeriveInput); + let struct_name = input_parsed.ident.clone(); + + let group_ident: proc_macro2::TokenStream = crate::default_program_path(); + + let any_output_convert_impls = + proc_macro2::TokenStream::from(build_any_output_convert_impls(&struct_name, &group_ident)); + + // Generate both Serialize and Grouped implementations + let expanded = quote! { + #[derive(serde::Serialize)] + #input_parsed + + ::mingling::macros::register_type!(#struct_name); + + impl ::mingling::Grouped<#group_ident> for #struct_name { + fn member_id() -> #group_ident { + #group_ident::#struct_name + } + } + + #any_output_convert_impls + }; + + expanded.into() +} + +fn build_any_output_convert_impls( + struct_name: &Ident, + group_ident: &proc_macro2::TokenStream, +) -> TokenStream { + quote! { + impl ::std::convert::Into<::mingling::AnyOutput<#group_ident>> for #struct_name { + fn into(self) -> ::mingling::AnyOutput<#group_ident> { + ::mingling::AnyOutput::new(self) + } + } + + impl ::std::convert::Into<::mingling::ChainProcess<#group_ident>> for #struct_name { + fn into(self) -> ::mingling::ChainProcess<#group_ident> { + ::mingling::AnyOutput::new(self).route_chain() + } + } + } + .into() +} |
