From 95407a4ca5be1273676b5e25ec1f7a19bdeb7341 Mon Sep 17 00:00:00 2001 From: Steven Fackler Date: Tue, 5 Sep 2017 21:55:06 -0700 Subject: [PATCH] Support field ident deserialization from u32 --- serde_derive/src/de.rs | 39 +++++++++++++++++++------------------ test_suite/tests/test_de.rs | 9 +++++++++ 2 files changed, 29 insertions(+), 19 deletions(-) diff --git a/serde_derive/src/de.rs b/serde_derive/src/de.rs index 5ab6d0a9..8f6f717b 100644 --- a/serde_derive/src/de.rs +++ b/serde_derive/src/de.rs @@ -1384,26 +1384,27 @@ 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)) - } - } - }; - Some(visit_index) + let index_expecting = if is_variant { + "variant" } else { - None + "field" + }; + + let variant_indices = 0u32..; + let fallthrough_msg = format!("{} index 0 <= i < {}", index_expecting, 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 bytes_to_str = if fallthrough.is_some() { diff --git a/test_suite/tests/test_de.rs b/test_suite/tests/test_de.rs index 9fbfed46..da7232a5 100644 --- a/test_suite/tests/test_de.rs +++ b/test_suite/tests/test_de.rs @@ -521,6 +521,15 @@ declare_tests! { Token::I32(2), Token::MapEnd, ], + Struct { a: 1, b: 2, c: 0 } => &[ + Token::Map { len: Some(3) }, + Token::U32(0), + Token::I32(1), + + Token::U32(1), + Token::I32(2), + Token::MapEnd, + ], Struct { a: 1, b: 2, c: 0 } => &[ Token::Struct { name: "Struct", len: 3 }, Token::Str("a"),