Allow Vecs, BTreeMaps, and HashMaps to be deserialized from a unit

Closes #36
This commit is contained in:
Erick Tryzelaar
2015-03-20 08:47:33 -07:00
parent d17846eff1
commit 09de237033
3 changed files with 58 additions and 2 deletions
+21
View File
@@ -659,6 +659,13 @@ impl<T> VecVisitor<T> {
impl<T> Visitor for VecVisitor<T> where T: Deserialize { impl<T> Visitor for VecVisitor<T> where T: Deserialize {
type Value = Vec<T>; type Value = Vec<T>;
#[inline]
fn visit_unit<E>(&mut self) -> Result<Vec<T>, E>
where E: Error,
{
Ok(vec![])
}
#[inline] #[inline]
fn visit_seq<V>(&mut self, mut visitor: V) -> Result<Vec<T>, V::Error> fn visit_seq<V>(&mut self, mut visitor: V) -> Result<Vec<T>, V::Error>
where V: SeqVisitor, where V: SeqVisitor,
@@ -767,6 +774,13 @@ impl<K, V> Visitor for HashMapVisitor<K, V>
{ {
type Value = HashMap<K, V>; type Value = HashMap<K, V>;
#[inline]
fn visit_unit<E>(&mut self) -> Result<HashMap<K, V>, E>
where E: Error,
{
Ok(HashMap::new())
}
#[inline] #[inline]
fn visit_map<V_>(&mut self, mut visitor: V_) -> Result<HashMap<K, V>, V_::Error> fn visit_map<V_>(&mut self, mut visitor: V_) -> Result<HashMap<K, V>, V_::Error>
where V_: MapVisitor, where V_: MapVisitor,
@@ -816,6 +830,13 @@ impl<K, V> Visitor for BTreeMapVisitor<K, V>
{ {
type Value = BTreeMap<K, V>; type Value = BTreeMap<K, V>;
#[inline]
fn visit_unit<E>(&mut self) -> Result<BTreeMap<K, V>, E>
where E: Error,
{
Ok(BTreeMap::new())
}
#[inline] #[inline]
fn visit_map<Visitor>(&mut self, mut visitor: Visitor) -> Result<BTreeMap<K, V>, Visitor::Error> fn visit_map<Visitor>(&mut self, mut visitor: Visitor) -> Result<BTreeMap<K, V>, Visitor::Error>
where Visitor: MapVisitor, where Visitor: MapVisitor,
+28
View File
@@ -499,6 +499,9 @@ declare_tests! {
], ],
} }
test_vec { test_vec {
Vec::<isize>::new() => vec![
Token::Unit,
],
Vec::<isize>::new() => vec![ Vec::<isize>::new() => vec![
Token::SeqStart(0), Token::SeqStart(0),
Token::SeqEnd, Token::SeqEnd,
@@ -525,6 +528,15 @@ declare_tests! {
Token::SeqEnd, Token::SeqEnd,
Token::SeqEnd, Token::SeqEnd,
], ],
Vec::<isize>::new() => vec![
Token::Name("Anything"),
Token::Unit,
],
Vec::<isize>::new() => vec![
Token::Name("Anything"),
Token::SeqStart(0),
Token::SeqEnd,
],
} }
test_tuple { test_tuple {
(1,) => vec![ (1,) => vec![
@@ -547,6 +559,13 @@ declare_tests! {
], ],
} }
test_btreemap { test_btreemap {
BTreeMap::<isize, isize>::new() => vec![
Token::Unit,
],
BTreeMap::<isize, isize>::new() => vec![
Token::MapStart(0),
Token::MapEnd,
],
btreemap![1 => 2] => vec![ btreemap![1 => 2] => vec![
Token::MapStart(1), Token::MapStart(1),
Token::MapSep(true), Token::MapSep(true),
@@ -585,6 +604,15 @@ declare_tests! {
Token::MapEnd, Token::MapEnd,
Token::MapEnd, Token::MapEnd,
], ],
BTreeMap::<isize, isize>::new() => vec![
Token::Name("Anything"),
Token::Unit,
],
BTreeMap::<isize, isize>::new() => vec![
Token::Name("Anything"),
Token::MapStart(0),
Token::MapEnd,
],
} }
test_named_map { test_named_map {
NamedMap { a: 1, b: 2, c: 3 } => vec![ NamedMap { a: 1, b: 2, c: 3 } => vec![
+9 -2
View File
@@ -861,8 +861,8 @@ fn test_parse_object() {
#[test] #[test]
fn test_parse_struct() { fn test_parse_struct() {
test_parse_err::<Outer>(vec![ test_parse_err::<Outer>(vec![
("[]", Error::SyntaxError(ErrorCode::ExpectedSomeValue, 0, 0)), ("5", Error::SyntaxError(ErrorCode::ExpectedSomeValue, 0, 0)),
("{}", Error::SyntaxError(ErrorCode::ExpectedSomeValue, 0, 0)), ("\"hello\"", Error::SyntaxError(ErrorCode::ExpectedSomeValue, 0, 0)),
("{\"inner\": true}", 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] #[test]