diff --git a/crates/stef-build/src/decode.rs b/crates/stef-build/src/decode.rs index 1767e54..3bbf56d 100644 --- a/crates/stef-build/src/decode.rs +++ b/crates/stef-build/src/decode.rs @@ -91,29 +91,29 @@ fn compile_variant( } fn compile_field_vars(fields: &Fields<'_>) -> TokenStream { - match fields { - Fields::Named(named) => { - let vars = named.iter().map(|named| { - let name = Ident::new(named.name, Span::call_site()); - let ty = super::definition::compile_data_type(&named.ty); - - quote! { let mut #name: Option<#ty> = None; } - }); - - quote! { #(#vars)* } + let vars: Box> = match fields { + Fields::Named(named) => Box::new(named.iter().map(|named| { + let name = Ident::new(named.name, Span::call_site()); + (name, &named.ty) + })), + Fields::Unnamed(unnamed) => Box::new(unnamed.iter().enumerate().map(|(idx, unnamed)| { + let name = Ident::new(&format!("n{idx}"), Span::call_site()); + (name, &unnamed.ty) + })), + Fields::Unit => return quote! {}, + }; + + let vars = vars.map(|(name, ty)| { + let ty_ident = super::definition::compile_data_type(ty); + + if matches!(ty, DataType::Option(_)) { + quote! { let mut #name: #ty_ident = None; } + } else { + quote! { let mut #name: Option<#ty_ident> = None; } } - Fields::Unnamed(unnamed) => { - let vars = unnamed.iter().enumerate().map(|(idx, unnamed)| { - let name = Ident::new(&format!("n{idx}"), Span::call_site()); - let ty = super::definition::compile_data_type(&unnamed.ty); - - quote! { let mut #name: Option<#ty> = None;} - }); + }); - quote! { #(#vars)* } - } - Fields::Unit => quote! {}, - } + quote! { #(#vars)* } } fn compile_field_matches(fields: &Fields<'_>) -> TokenStream { diff --git a/crates/stef-build/tests/snapshots/parser__compile@types-generic.stef.snap b/crates/stef-build/tests/snapshots/parser__compile@types-generic.stef.snap index f695d5d..b31c7f2 100644 --- a/crates/stef-build/tests/snapshots/parser__compile@types-generic.stef.snap +++ b/crates/stef-build/tests/snapshots/parser__compile@types-generic.stef.snap @@ -32,7 +32,7 @@ impl ::stef::Decode for Sample { let mut f1: Option> = None; let mut f2: Option> = None; let mut f3: Option> = None; - let mut f4: Option> = None; + let mut f4: Option = None; let mut f5: Option = None; loop { match ::stef::buf::decode_id(r)? {