mirror of
https://github.com/pezkuwichain/serde.git
synced 2026-06-14 02:21:01 +00:00
Allow Vecs, BTreeMaps, and HashMaps to be deserialized from a unit
Closes #36
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
@@ -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
@@ -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]
|
||||||
|
|||||||
Reference in New Issue
Block a user