From be54d15d4695462ff425bad63d9dbbdd57890e20 Mon Sep 17 00:00:00 2001 From: HimbeerserverDE Date: Sat, 20 May 2023 23:05:54 +0200 Subject: fix generated code compiler errors --- src/lib.rs | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 66a1dcb..649b524 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -45,20 +45,42 @@ pub fn derive_deserialize(item: TokenStream) -> TokenStream { let mut len_for = std::collections::HashMap::new(); let mut discriminant_for = std::collections::HashMap::new(); - let deserializers = ast.fields.iter().map(|field| { - let mut out = TokenStream2::new(); - - let field_name = field.ident.as_ref().expect("should be a names struct"); + let has_len_annotations = ast.fields.iter().any(|field| { + let args = Args::from_attributes(&field.attrs).unwrap(); + args.len_for.is_some() + }); + let has_discriminant_annotations = ast.fields.iter().any(|field| { let args = Args::from_attributes(&field.attrs).unwrap(); + args.discriminant_for.is_some() + }); + + let mut map_declarations = TokenStream2::new(); - out.extend( + if has_len_annotations { + map_declarations.extend( vec![quote!( let mut len_for = std::collections::HashMap::new(); + )] + .into_iter(), + ); + } + + if has_discriminant_annotations { + map_declarations.extend( + vec![quote!( let mut discriminant_for = std::collections::HashMap::new(); )] .into_iter(), ); + } + + let deserializers = ast.fields.iter().map(|field| { + let mut out = TokenStream2::new(); + + let field_name = field.ident.as_ref().expect("should be a names struct"); + + let args = Args::from_attributes(&field.attrs).unwrap(); if let Some(attr) = args.len_for { out.extend( @@ -120,6 +142,8 @@ pub fn derive_deserialize(item: TokenStream) -> TokenStream { quote!( impl Deserialize for #name { fn deserialize(&mut self, r: &mut R) -> Result<()> { + #map_declarations + #(#deserializers) * Ok(()) -- cgit v1.2.3