From 1fca7dbb322d40368a91e1a5d0a17f4f851fea18 Mon Sep 17 00:00:00 2001 From: "Craig M. Brandenburg" Date: Sat, 23 Jan 2016 05:57:25 -0700 Subject: [PATCH] Fix: Report correct error code for missing field This resolves #22, resolves #29, and resolves #30. * The reported error code is now `MissingField`, not `ExpectedSomeValue`. * A missing `()` field now causes a `MissingField` error. * A missing `Vec<_>` field now causes a `MissingField` error. Tests have been updated to check these cases. --- json/src/de.rs | 25 +++++++++++++++++++++++-- json_tests/tests/test_json.rs | 25 +++++++++++++++---------- 2 files changed, 38 insertions(+), 12 deletions(-) diff --git a/json/src/de.rs b/json/src/de.rs index 7b9bc8e..02b22c2 100644 --- a/json/src/de.rs +++ b/json/src/de.rs @@ -745,10 +745,31 @@ impl<'a, Iter> de::MapVisitor for MapVisitor<'a, Iter> } } - fn missing_field(&mut self, _field: &'static str) -> Result + fn missing_field(&mut self, field: &'static str) -> Result where V: de::Deserialize, { - let mut de = de::value::ValueDeserializer::into_deserializer(()); + use std; + + struct MissingFieldDeserializer(&'static str); + + impl de::Deserializer for MissingFieldDeserializer { + type Error = de::value::Error; + + fn visit(&mut self, _visitor: V) -> std::result::Result + where V: de::Visitor, + { + let &mut MissingFieldDeserializer(field) = self; + Err(de::value::Error::MissingFieldError(field)) + } + + fn visit_option(&mut self, mut visitor: V) -> std::result::Result + where V: de::Visitor, + { + visitor.visit_none() + } + } + + let mut de = MissingFieldDeserializer(field); Ok(try!(de::Deserialize::deserialize(&mut de))) } } diff --git a/json_tests/tests/test_json.rs b/json_tests/tests/test_json.rs index d5ad4c9..dd4e857 100644 --- a/json_tests/tests/test_json.rs +++ b/json_tests/tests/test_json.rs @@ -911,6 +911,8 @@ fn test_parse_struct() { ("5", Error::SyntaxError(ErrorCode::ExpectedSomeValue, 1, 1)), ("\"hello\"", Error::SyntaxError(ErrorCode::ExpectedSomeValue, 1, 7)), ("{\"inner\": true}", Error::SyntaxError(ErrorCode::ExpectedSomeValue, 1, 14)), + ("{}", Error::SyntaxError(ErrorCode::MissingField("inner"), 1, 2)), + (r#"{"inner": [{"b": 42, "c": []}]}"#, Error::SyntaxError(ErrorCode::MissingField("a"), 1, 29)), ]); test_parse_ok(vec![ @@ -936,15 +938,6 @@ fn test_parse_struct() { ), ]); - let v: Outer = from_str("{}").unwrap(); - - assert_eq!( - v, - Outer { - inner: vec![], - } - ); - let v: Outer = from_str( "[ [ @@ -1057,7 +1050,7 @@ fn test_multiline_errors() { } #[test] -fn test_missing_field() { +fn test_missing_option_field() { #[derive(Debug, PartialEq, Deserialize)] struct Foo { x: Option, @@ -1078,6 +1071,18 @@ fn test_missing_field() { assert_eq!(value, Foo { x: Some(5) }); } +#[test] +fn test_missing_nonoption_field() { + #[derive(Debug, PartialEq, Deserialize)] + struct Foo { + x: u32, + } + + test_parse_err::(vec![ + ("{}", Error::SyntaxError(ErrorCode::MissingField("x"), 1, 2)), + ]); +} + #[test] fn test_missing_renamed_field() { #[derive(Debug, PartialEq, Deserialize)]