diff --git a/serde_derive/src/de.rs b/serde_derive/src/de.rs index 6474fca0..78f94531 100644 --- a/serde_derive/src/de.rs +++ b/serde_derive/src/de.rs @@ -2228,19 +2228,12 @@ fn deserialize_identifier( quote!(#(#aliases)|* => _serde::__private::Ok(#this_value::#ident)) }); - let main_constructors: &Vec<_> = &fields - .iter() - .map(|(_, ident, _)| quote!(#this_value::#ident)) - .collect(); - let expecting = expecting.unwrap_or(if is_variant { "variant identifier" } else { "field identifier" }); - let index_expecting = if is_variant { "variant" } else { "field" }; - let bytes_to_str = if fallthrough.is_some() || collect_other_fields { None } else { @@ -2292,6 +2285,7 @@ fn deserialize_identifier( let u64_fallthrough_arm = if let Some(fallthrough) = &fallthrough { fallthrough } else { + let index_expecting = if is_variant { "variant" } else { "field" }; let fallthrough_msg = format!("{} index 0 <= i < {}", index_expecting, fields.len()); u64_fallthrough_arm_tokens = quote! { _serde::__private::Err(_serde::de::Error::invalid_value( @@ -2302,7 +2296,6 @@ fn deserialize_identifier( &u64_fallthrough_arm_tokens }; - let variant_indices = 0_u64..; let visit_other = if collect_other_fields { quote! { fn visit_bool<__E>(self, __value: bool) -> _serde::__private::Result @@ -2397,15 +2390,18 @@ fn deserialize_identifier( } } } else { + let u64_mapping = fields.iter().enumerate().map(|(i, (_, ident, _))| { + let i = i as u64; + quote!(#i => _serde::__private::Ok(#this_value::#ident)) + }); + quote! { fn visit_u64<__E>(self, __value: u64) -> _serde::__private::Result where __E: _serde::de::Error, { match __value { - #( - #variant_indices => _serde::__private::Ok(#main_constructors), - )* + #(#u64_mapping,)* _ => #u64_fallthrough_arm, } }