From eec710189423d5770bd498fd674e3431483649db Mon Sep 17 00:00:00 2001 From: Steven Fackler Date: Sat, 17 Jun 2017 18:09:49 -0700 Subject: [PATCH] Support deserialization of struct keys from integers serde-cbor supports a "packed" serialization flag which causes keys to be serialized as their indices, but the deserializer currently has to hardcode support for this format. We can simply support deserialization of struct keys from integers as we already do for enum variants. --- serde_derive/src/de.rs | 33 ++++++++++++++------------------- test_suite/tests/test_de.rs | 11 +++++++++++ 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/serde_derive/src/de.rs b/serde_derive/src/de.rs index 20ccb696..5d403613 100644 --- a/serde_derive/src/de.rs +++ b/serde_derive/src/de.rs @@ -1386,26 +1386,21 @@ fn deserialize_identifier( "field identifier" }; - 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)) - } + 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 d1bddfaf..c0a889af 100644 --- a/test_suite/tests/test_de.rs +++ b/test_suite/tests/test_de.rs @@ -605,6 +605,17 @@ 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" },