Skip to content

Commit

Permalink
fix: don't double wrap optional types in decode
Browse files Browse the repository at this point in the history
  • Loading branch information
dnaka91 committed Sep 13, 2023
1 parent 1313fe9 commit a6d3d4b
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 22 deletions.
42 changes: 21 additions & 21 deletions crates/stef-build/src/decode.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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<dyn Iterator<Item = _>> = 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 {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ impl ::stef::Decode for Sample {
let mut f1: Option<Vec<u32>> = None;
let mut f2: Option<HashMap<u32, String>> = None;
let mut f3: Option<HashSet<u32>> = None;
let mut f4: Option<Option<u32>> = None;
let mut f4: Option<u32> = None;
let mut f5: Option<NonZeroU32> = None;
loop {
match ::stef::buf::decode_id(r)? {
Expand Down

0 comments on commit a6d3d4b

Please sign in to comment.