From 4fdba725fe30dc30658b8e71bead7d9b83ab9b0f Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Sun, 18 Jun 2017 09:11:21 -0700 Subject: [PATCH] Revert "Support deserialization of struct keys from integers" This is not as useful as expected because the Serializer does not know the real index of each struct field being serialized. The best it can do is keep a counter, which goes wrong if fields are conditionally skipped. This reverts commit eec710189423d5770bd498fd674e3431483649db. --- serde_derive/src/de.rs | 33 +++++++++++++++++++-------------- test_suite/tests/test_de.rs | 11 ----------- 2 files changed, 19 insertions(+), 25 deletions(-) diff --git a/serde_derive/src/de.rs b/serde_derive/src/de.rs index 5d403613..20ccb696 100644 --- a/serde_derive/src/de.rs +++ b/serde_derive/src/de.rs @@ -1386,21 +1386,26 @@ fn deserialize_identifier( "field identifier" }; - let variant_indices = 0u32..; - let fallthrough_msg = format!("variant index 0 <= i < {}", fields.len()); - let visit_index = quote! { - fn visit_u32<__E>(self, __value: u32) -> _serde::export::Result - where __E: _serde::de::Error - { - match __value { - #( - #variant_indices => _serde::export::Ok(#constructors), - )* - _ => _serde::export::Err(_serde::de::Error::invalid_value( - _serde::de::Unexpected::Unsigned(__value as u64), - &#fallthrough_msg)) + let visit_index = if is_variant { + let variant_indices = 0u32..; + let fallthrough_msg = format!("variant index 0 <= i < {}", fields.len()); + let visit_index = quote! { + fn visit_u32<__E>(self, __value: u32) -> _serde::export::Result + where __E: _serde::de::Error + { + match __value { + #( + #variant_indices => _serde::export::Ok(#constructors), + )* + _ => _serde::export::Err(_serde::de::Error::invalid_value( + _serde::de::Unexpected::Unsigned(__value as u64), + &#fallthrough_msg)) + } } - } + }; + Some(visit_index) + } else { + None }; let bytes_to_str = if fallthrough.is_some() { diff --git a/test_suite/tests/test_de.rs b/test_suite/tests/test_de.rs index c0a889af..d1bddfaf 100644 --- a/test_suite/tests/test_de.rs +++ b/test_suite/tests/test_de.rs @@ -605,17 +605,6 @@ declare_tests! { Token::StructEnd, ], } - test_struct_integer_keys { - Struct { a: 1, b: 2, c: 0 } => &[ - Token::Struct { name: "Struct", len: 2 }, - Token::U32(0), - Token::I32(1), - - Token::U32(1), - Token::I32(2), - Token::StructEnd, - ], - } test_enum_unit { Enum::Unit => &[ Token::UnitVariant { name: "Enum", variant: "Unit" },