From b1fbbfd3cea8adea92a860a71aa827c53c7674ca Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Tue, 17 Jan 2017 23:52:06 -0800 Subject: [PATCH] Restore visit_usize for identifying variants --- serde_codegen/src/de.rs | 21 +++++++++++++++++++++ testing/tests/test_de.rs | 13 ++++++++++--- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/serde_codegen/src/de.rs b/serde_codegen/src/de.rs index 32f186ee..3135cb5b 100644 --- a/serde_codegen/src/de.rs +++ b/serde_codegen/src/de.rs @@ -657,6 +657,25 @@ fn deserialize_field_visitor( Some(quote!(__ignore,)) }; + let visit_usize = if is_variant { + let variant_indices = 0usize..; + let fallthrough_msg = format!("expected variant index 0 <= i < {}", fields.len()); + Some(quote! { + fn visit_usize<__E>(self, value: usize) -> ::std::result::Result<__Field, __E> + where __E: _serde::de::Error + { + match value { + #( + #variant_indices => Ok(__Field::#field_idents), + )* + _ => Err(_serde::de::Error::invalid_value(#fallthrough_msg)) + } + } + }) + } else { + None + }; + let fallthrough_arm = if is_variant { quote! { Err(_serde::de::Error::unknown_variant(value)) @@ -688,6 +707,8 @@ fn deserialize_field_visitor( impl _serde::de::Visitor for __FieldVisitor { type Value = __Field; + #visit_usize + fn visit_str<__E>(self, value: &str) -> ::std::result::Result<__Field, __E> where __E: _serde::de::Error { diff --git a/testing/tests/test_de.rs b/testing/tests/test_de.rs index 3359492e..f0a56a4d 100644 --- a/testing/tests/test_de.rs +++ b/testing/tests/test_de.rs @@ -774,6 +774,13 @@ declare_tests! { Token::EnumMapEnd, ], } + test_enum_unit_usize { + Enum::Unit => &[ + Token::EnumStart("Enum"), + Token::Usize(0), + Token::Unit, + ], + } test_box { Box::new(0i32) => &[Token::I32(0)], } @@ -918,13 +925,13 @@ declare_error_tests! { ], Error::DuplicateField("a"), } - test_enum_unit_usize { + test_enum_out_of_range { &[ Token::EnumStart("Enum"), - Token::Usize(0), + Token::Usize(4), Token::Unit, ], - Error::InvalidType(Type::U64), + Error::InvalidValue("expected variant index 0 <= i < 4".to_owned()), } test_enum_unit_bytes { &[