Skip to content

Commit

Permalink
Check for sequence end
Browse files Browse the repository at this point in the history
  • Loading branch information
dtolnay committed Feb 3, 2017
1 parent d298da0 commit 02e6c04
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 16 deletions.
20 changes: 16 additions & 4 deletions serde/src/de/content.rs
Original file line number Diff line number Diff line change
Expand Up @@ -537,11 +537,17 @@ impl<E> Deserializer for Content<E>
Content::Newtype(v) => visitor.visit_newtype_struct(*v),
Content::Seq(v) => {
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) => {
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),
}
Expand Down Expand Up @@ -611,11 +617,17 @@ impl<'a, E> Deserializer for &'a Content<E>
Content::Newtype(ref v) => visitor.visit_newtype_struct(&**v),
Content::Seq(ref v) => {
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) => {
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),
}
Expand Down
28 changes: 16 additions & 12 deletions serde/src/de/value.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
while self.iter.next().is_some() {
remaining += 1;
Expand Down Expand Up @@ -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)> {
match self.iter.next() {
Some(kv) => {
self.count += 1;
Some(private::Pair::split(kv))
}
None => None,
}
}

fn end(&mut self) -> Result<(), E> {
/// Check for remaining elements after passing a `MapDeserializer` to
/// `Visitor::visit_map`.
pub fn end(mut self) -> Result<(), E> {
let mut remaining = 0;
while self.iter.next().is_some() {
remaining += 1;
Expand All @@ -633,6 +627,16 @@ impl<I, E> MapDeserializer<I, E>
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>
Expand Down
18 changes: 18 additions & 0 deletions test_suite/tests/test_macros.rs
Original file line number Diff line number Diff line change
Expand Up @@ -725,6 +725,24 @@ fn test_untagged_enum() {
],
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]
Expand Down

0 comments on commit 02e6c04

Please sign in to comment.