mirror of
https://github.com/serde-rs/serde.git
synced 2025-10-02 23:35:26 +00:00
Check for sequence end
This commit is contained in:
parent
d298da0b4f
commit
02e6c04e9f
@ -537,11 +537,17 @@ impl<E> Deserializer for Content<E>
|
|||||||
Content::Newtype(v) => visitor.visit_newtype_struct(*v),
|
Content::Newtype(v) => visitor.visit_newtype_struct(*v),
|
||||||
Content::Seq(v) => {
|
Content::Seq(v) => {
|
||||||
let seq = v.into_iter();
|
let seq = v.into_iter();
|
||||||
visitor.visit_seq(de::value::SeqDeserializer::new(seq))
|
let mut seq_visitor = de::value::SeqDeserializer::new(seq);
|
||||||
|
let value = try!(visitor.visit_seq(&mut seq_visitor));
|
||||||
|
try!(seq_visitor.end());
|
||||||
|
Ok(value)
|
||||||
},
|
},
|
||||||
Content::Map(v) => {
|
Content::Map(v) => {
|
||||||
let map = v.into_iter();
|
let map = v.into_iter();
|
||||||
visitor.visit_map(de::value::MapDeserializer::new(map))
|
let mut map_visitor = de::value::MapDeserializer::new(map);
|
||||||
|
let value = try!(visitor.visit_map(&mut map_visitor));
|
||||||
|
try!(map_visitor.end());
|
||||||
|
Ok(value)
|
||||||
},
|
},
|
||||||
Content::Bytes(v) => visitor.visit_byte_buf(v),
|
Content::Bytes(v) => visitor.visit_byte_buf(v),
|
||||||
}
|
}
|
||||||
@ -611,11 +617,17 @@ impl<'a, E> Deserializer for &'a Content<E>
|
|||||||
Content::Newtype(ref v) => visitor.visit_newtype_struct(&**v),
|
Content::Newtype(ref v) => visitor.visit_newtype_struct(&**v),
|
||||||
Content::Seq(ref v) => {
|
Content::Seq(ref v) => {
|
||||||
let seq = v.into_iter();
|
let seq = v.into_iter();
|
||||||
visitor.visit_seq(de::value::SeqDeserializer::new(seq))
|
let mut seq_visitor = de::value::SeqDeserializer::new(seq);
|
||||||
|
let value = try!(visitor.visit_seq(&mut seq_visitor));
|
||||||
|
try!(seq_visitor.end());
|
||||||
|
Ok(value)
|
||||||
},
|
},
|
||||||
Content::Map(ref v) => {
|
Content::Map(ref v) => {
|
||||||
let map = v.into_iter().map(|&(ref k, ref v)| (k, v));
|
let map = v.into_iter().map(|&(ref k, ref v)| (k, v));
|
||||||
visitor.visit_map(de::value::MapDeserializer::new(map))
|
let mut map_visitor = de::value::MapDeserializer::new(map);
|
||||||
|
let value = try!(visitor.visit_map(&mut map_visitor));
|
||||||
|
try!(map_visitor.end());
|
||||||
|
Ok(value)
|
||||||
},
|
},
|
||||||
Content::Bytes(ref v) => visitor.visit_bytes(v),
|
Content::Bytes(ref v) => visitor.visit_bytes(v),
|
||||||
}
|
}
|
||||||
|
@ -428,7 +428,9 @@ impl<I, E> SeqDeserializer<I, E>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn end(&mut self) -> Result<(), E> {
|
/// Check for remaining elements after passing a `SeqDeserializer` to
|
||||||
|
/// `Visitor::visit_seq`.
|
||||||
|
pub fn end(mut self) -> Result<(), E> {
|
||||||
let mut remaining = 0;
|
let mut remaining = 0;
|
||||||
while self.iter.next().is_some() {
|
while self.iter.next().is_some() {
|
||||||
remaining += 1;
|
remaining += 1;
|
||||||
@ -610,17 +612,9 @@ impl<I, E> MapDeserializer<I, E>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn next_pair(&mut self) -> Option<(<I::Item as private::Pair>::First, <I::Item as private::Pair>::Second)> {
|
/// Check for remaining elements after passing a `MapDeserializer` to
|
||||||
match self.iter.next() {
|
/// `Visitor::visit_map`.
|
||||||
Some(kv) => {
|
pub fn end(mut self) -> Result<(), E> {
|
||||||
self.count += 1;
|
|
||||||
Some(private::Pair::split(kv))
|
|
||||||
}
|
|
||||||
None => None,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn end(&mut self) -> Result<(), E> {
|
|
||||||
let mut remaining = 0;
|
let mut remaining = 0;
|
||||||
while self.iter.next().is_some() {
|
while self.iter.next().is_some() {
|
||||||
remaining += 1;
|
remaining += 1;
|
||||||
@ -633,6 +627,16 @@ impl<I, E> MapDeserializer<I, E>
|
|||||||
Err(de::Error::invalid_length(self.count + remaining, &ExpectedInMap(self.count)))
|
Err(de::Error::invalid_length(self.count + remaining, &ExpectedInMap(self.count)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn next_pair(&mut self) -> Option<(<I::Item as private::Pair>::First, <I::Item as private::Pair>::Second)> {
|
||||||
|
match self.iter.next() {
|
||||||
|
Some(kv) => {
|
||||||
|
self.count += 1;
|
||||||
|
Some(private::Pair::split(kv))
|
||||||
|
}
|
||||||
|
None => None,
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<I, E> de::Deserializer for MapDeserializer<I, E>
|
impl<I, E> de::Deserializer for MapDeserializer<I, E>
|
||||||
|
@ -725,6 +725,24 @@ fn test_untagged_enum() {
|
|||||||
],
|
],
|
||||||
Error::Message("data did not match any variant of untagged enum Untagged".to_owned()),
|
Error::Message("data did not match any variant of untagged enum Untagged".to_owned()),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
assert_de_tokens_error::<Untagged>(
|
||||||
|
&[
|
||||||
|
Token::TupleStart(3),
|
||||||
|
|
||||||
|
Token::TupleSep,
|
||||||
|
Token::U8(1),
|
||||||
|
|
||||||
|
Token::TupleSep,
|
||||||
|
Token::U8(2),
|
||||||
|
|
||||||
|
Token::TupleSep,
|
||||||
|
Token::U8(3),
|
||||||
|
|
||||||
|
Token::TupleEnd,
|
||||||
|
],
|
||||||
|
Error::Message("data did not match any variant of untagged enum Untagged".to_owned()),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user