From 09de237033f479ec8d488a04381e2897a817f461 Mon Sep 17 00:00:00 2001 From: Erick Tryzelaar Date: Fri, 20 Mar 2015 08:47:33 -0700 Subject: [PATCH] Allow Vecs, BTreeMaps, and HashMaps to be deserialized from a unit Closes #36 --- src/de.rs | 21 +++++++++++++++++++++ tests/test_de.rs | 28 ++++++++++++++++++++++++++++ tests/test_json.rs | 11 +++++++++-- 3 files changed, 58 insertions(+), 2 deletions(-) diff --git a/src/de.rs b/src/de.rs index 08abb83c..c76eeef0 100644 --- a/src/de.rs +++ b/src/de.rs @@ -659,6 +659,13 @@ impl VecVisitor { impl Visitor for VecVisitor where T: Deserialize { type Value = Vec; + #[inline] + fn visit_unit(&mut self) -> Result, E> + where E: Error, + { + Ok(vec![]) + } + #[inline] fn visit_seq(&mut self, mut visitor: V) -> Result, V::Error> where V: SeqVisitor, @@ -767,6 +774,13 @@ impl Visitor for HashMapVisitor { type Value = HashMap; + #[inline] + fn visit_unit(&mut self) -> Result, E> + where E: Error, + { + Ok(HashMap::new()) + } + #[inline] fn visit_map(&mut self, mut visitor: V_) -> Result, V_::Error> where V_: MapVisitor, @@ -816,6 +830,13 @@ impl Visitor for BTreeMapVisitor { type Value = BTreeMap; + #[inline] + fn visit_unit(&mut self) -> Result, E> + where E: Error, + { + Ok(BTreeMap::new()) + } + #[inline] fn visit_map(&mut self, mut visitor: Visitor) -> Result, Visitor::Error> where Visitor: MapVisitor, diff --git a/tests/test_de.rs b/tests/test_de.rs index fe584d50..c0a69f2f 100644 --- a/tests/test_de.rs +++ b/tests/test_de.rs @@ -499,6 +499,9 @@ declare_tests! { ], } test_vec { + Vec::::new() => vec![ + Token::Unit, + ], Vec::::new() => vec![ Token::SeqStart(0), Token::SeqEnd, @@ -525,6 +528,15 @@ declare_tests! { Token::SeqEnd, Token::SeqEnd, ], + Vec::::new() => vec![ + Token::Name("Anything"), + Token::Unit, + ], + Vec::::new() => vec![ + Token::Name("Anything"), + Token::SeqStart(0), + Token::SeqEnd, + ], } test_tuple { (1,) => vec![ @@ -547,6 +559,13 @@ declare_tests! { ], } test_btreemap { + BTreeMap::::new() => vec![ + Token::Unit, + ], + BTreeMap::::new() => vec![ + Token::MapStart(0), + Token::MapEnd, + ], btreemap![1 => 2] => vec![ Token::MapStart(1), Token::MapSep(true), @@ -585,6 +604,15 @@ declare_tests! { Token::MapEnd, Token::MapEnd, ], + BTreeMap::::new() => vec![ + Token::Name("Anything"), + Token::Unit, + ], + BTreeMap::::new() => vec![ + Token::Name("Anything"), + Token::MapStart(0), + Token::MapEnd, + ], } test_named_map { NamedMap { a: 1, b: 2, c: 3 } => vec![ diff --git a/tests/test_json.rs b/tests/test_json.rs index f3da0078..c92f5995 100644 --- a/tests/test_json.rs +++ b/tests/test_json.rs @@ -861,8 +861,8 @@ fn test_parse_object() { #[test] fn test_parse_struct() { test_parse_err::(vec![ - ("[]", Error::SyntaxError(ErrorCode::ExpectedSomeValue, 0, 0)), - ("{}", Error::SyntaxError(ErrorCode::ExpectedSomeValue, 0, 0)), + ("5", Error::SyntaxError(ErrorCode::ExpectedSomeValue, 0, 0)), + ("\"hello\"", Error::SyntaxError(ErrorCode::ExpectedSomeValue, 0, 0)), ("{\"inner\": true}", Error::SyntaxError(ErrorCode::ExpectedSomeValue, 0, 0)), ]); @@ -888,6 +888,13 @@ fn test_parse_struct() { }, ) ]); + + assert_eq!( + from_str("{}"), + Ok(Outer { + inner: vec![], + }) + ); } #[test]