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

View File

@ -659,6 +659,13 @@ impl<T> VecVisitor<T> {
impl<T> Visitor for VecVisitor<T> where T: Deserialize {
type Value = Vec<T>;
#[inline]
fn visit_unit<E>(&mut self) -> Result<Vec<T>, E>
where E: Error,
{
Ok(vec![])
}
#[inline]
fn visit_seq<V>(&mut self, mut visitor: V) -> Result<Vec<T>, V::Error>
where V: SeqVisitor,
@ -767,6 +774,13 @@ impl<K, V> Visitor for HashMapVisitor<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]
fn visit_map<V_>(&mut self, mut visitor: V_) -> Result<HashMap<K, V>, V_::Error>
where V_: MapVisitor,
@ -816,6 +830,13 @@ impl<K, V> Visitor for BTreeMapVisitor<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]
fn visit_map<Visitor>(&mut self, mut visitor: Visitor) -> Result<BTreeMap<K, V>, Visitor::Error>
where Visitor: MapVisitor,

View File

@ -499,6 +499,9 @@ declare_tests! {
],
}
test_vec {
Vec::<isize>::new() => vec![
Token::Unit,
],
Vec::<isize>::new() => vec![
Token::SeqStart(0),
Token::SeqEnd,
@ -525,6 +528,15 @@ declare_tests! {
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 {
(1,) => vec![
@ -547,6 +559,13 @@ declare_tests! {
],
}
test_btreemap {
BTreeMap::<isize, isize>::new() => vec![
Token::Unit,
],
BTreeMap::<isize, isize>::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::<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 {
NamedMap { a: 1, b: 2, c: 3 } => vec![

View File

@ -861,8 +861,8 @@ fn test_parse_object() {
#[test]
fn test_parse_struct() {
test_parse_err::<Outer>(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]