diff --git a/serde_codegen/src/de.rs b/serde_codegen/src/de.rs index 163874bd..1a4925fd 100644 --- a/serde_codegen/src/de.rs +++ b/serde_codegen/src/de.rs @@ -1,5 +1,5 @@ use syn::{self, aster}; -use quote::{self, Tokens}; +use quote::Tokens; use bound; use internals::ast::{Body, Field, Item, Style, Variant}; @@ -652,38 +652,6 @@ fn deserialize_field_visitor( Some(quote!(__ignore,)) }; - let index_field_arms: Vec<_> = field_idents.iter() - .enumerate() - .map(|(field_index, field_ident)| { - quote! { - #field_index => { Ok(__Field::#field_ident) } - } - }) - .collect(); - - let (index_error_msg, unknown_ident) = if is_variant { - ("expected a variant", aster::id("unknown_variant")) - } else { - ("expected a field", aster::id("unknown_field")) - }; - - let fallthrough_index_arm_expr = if !is_variant && !item_attrs.deny_unknown_fields() { - quote! { - Ok(__Field::__ignore) - } - } else { - quote! { - Err(_serde::de::Error::invalid_value(#index_error_msg)) - } - }; - - let index_body = quote! { - match value { - #(#index_field_arms)* - _ => #fallthrough_index_arm_expr - } - }; - // Match arms to extract a field from a string let str_field_arms: Vec<_> = field_idents.iter().zip(field_names.iter()) .map(|(field_ident, field_name)| { @@ -693,49 +661,18 @@ fn deserialize_field_visitor( }) .collect(); - let fallthrough_str_arm_expr = if !is_variant && !item_attrs.deny_unknown_fields() { + let fallthrough_str_arm_expr = if is_variant { quote! { - Ok(__Field::__ignore) + Err(_serde::de::Error::unknown_variant(value)) + } + } else if item_attrs.deny_unknown_fields() { + quote! { + Err(_serde::de::Error::unknown_field(value)) } } else { - quote! { - Err(_serde::de::Error::#unknown_ident(value)) - } - }; - - let str_body = quote! { - match value { - #(#str_field_arms)* - _ => #fallthrough_str_arm_expr - } - }; - - // Match arms to extract a field from a string - let bytes_field_arms: Vec<_> = field_idents.iter().zip(field_names.iter()) - .map(|(field_ident, field_name)| { - let bytes_field_name = quote::ByteStr(field_name); - quote! { - #bytes_field_name => { Ok(__Field::#field_ident) } - } - }) - .collect(); - - let fallthrough_bytes_arm_expr = if !is_variant && !item_attrs.deny_unknown_fields() { quote! { Ok(__Field::__ignore) } - } else { - quote!({ - let value = ::std::string::String::from_utf8_lossy(value); - Err(_serde::de::Error::#unknown_ident(&value)) - }) - }; - - let bytes_body = quote! { - match value { - #(#bytes_field_arms)* - _ => #fallthrough_bytes_arm_expr - } }; quote! { @@ -755,22 +692,13 @@ fn deserialize_field_visitor( impl _serde::de::Visitor for __FieldVisitor { type Value = __Field; - fn visit_usize<__E>(&mut self, value: usize) -> ::std::result::Result<__Field, __E> - where __E: _serde::de::Error - { - #index_body - } - fn visit_str<__E>(&mut self, value: &str) -> ::std::result::Result<__Field, __E> where __E: _serde::de::Error { - #str_body - } - - fn visit_bytes<__E>(&mut self, value: &[u8]) -> ::std::result::Result<__Field, __E> - where __E: _serde::de::Error - { - #bytes_body + match value { + #(#str_field_arms)* + _ => #fallthrough_str_arm_expr + } } } diff --git a/testing/tests/test_de.rs b/testing/tests/test_de.rs index 280d427f..43d50620 100644 --- a/testing/tests/test_de.rs +++ b/testing/tests/test_de.rs @@ -723,20 +723,6 @@ declare_tests! { Token::EnumMapEnd, ], } - test_enum_unit_usize { - Enum::Unit => &[ - Token::EnumStart("Enum"), - Token::Usize(0), - Token::Unit, - ], - } - test_enum_unit_bytes { - Enum::Unit => &[ - Token::EnumStart("Enum"), - Token::Bytes(b"Unit"), - Token::Unit, - ], - } test_box { Box::new(0i32) => &[Token::I32(0)], }