From 81dbee005957c7e51bae97d611f85df0f475b717 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Jos=C3=A9=20Pereira?= Date: Sat, 20 Apr 2024 13:46:11 -0300 Subject: [PATCH] build: Add inner function to extract struct from messages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Patrick José Pereira --- build/binder.rs | 22 +++++++++++++++++++++- build/parser.rs | 17 +++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/build/binder.rs b/build/binder.rs index 511eab214..1c5475b03 100644 --- a/build/binder.rs +++ b/build/binder.rs @@ -46,7 +46,7 @@ pub fn generate(modules: Vec, out: &mut W) { } }).collect::>(); - let deserialize_tokens = modules.into_iter().map(|module| { + let deserialize_tokens = modules.clone().into_iter().map(|module| { let pascal_case_ident = quote::format_ident!("{}", module.to_case(Case::Pascal)); let module_ident = quote::format_ident!("{module}"); quote! { @@ -56,10 +56,30 @@ pub fn generate(modules: Vec, out: &mut W) { } }).collect::>(); + let enum_tokens_inner = modules + .clone() + .into_iter() + .map(|module| { + let pascal_case_ident = quote::format_ident!("{}", module.to_case(Case::Pascal)); + + quote! { + Self::#pascal_case_ident(inner_enum) => inner_enum.inner(), + } + }) + .collect::>(); + let enum_ident = quote! { pub enum Messages { #(#enum_tokens)* } + + impl Messages { + pub fn inner(&self) -> Option<&T> { + match self { + #(#enum_tokens_inner)* + } + } + } }; let try_from_ident = quote! { diff --git a/build/parser.rs b/build/parser.rs index 317516d73..120f4d0d7 100644 --- a/build/parser.rs +++ b/build/parser.rs @@ -436,12 +436,29 @@ pub fn generate(input: &mut R, output_rust: &mut W) { quote!(#pascal_message_name(#pascal_struct_name),) }) .collect::>(); + + let message_enums_inner = messages + .iter() + .map(|(name, _message)| { + let pascal_message_name = ident!(name.to_case(Case::Pascal)); + quote!(Self::#pascal_message_name(inner_struct) => (inner_struct as &dyn std::any::Any).downcast_ref::(),) + }) + .collect::>(); + let message_enums = quote! { #[derive(Debug, Clone, PartialEq)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub enum Messages { #(#message_enums)* } + + impl Messages { + pub fn inner(&self) -> Option<&T> { + match self { + #(#message_enums_inner)* + } + } + } }; let message_tokens = messages