aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHimbeerserverDE <himbeerserverde@gmail.com>2023-05-20 23:05:54 +0200
committerHimbeerserverDE <himbeerserverde@gmail.com>2023-05-20 23:05:54 +0200
commitbe54d15d4695462ff425bad63d9dbbdd57890e20 (patch)
tree04df2bb2f427391534f544fd9735d65f304652e0
parent89d9f9ad228271c1777cb6744f365601cd12310b (diff)
fix generated code compiler errors
-rw-r--r--src/lib.rs34
1 files 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<R: std::io::Read>(&mut self, r: &mut R) -> Result<()> {
+ #map_declarations
+
#(#deserializers) *
Ok(())