diff --git a/serde_test/src/de.rs b/serde_test/src/de.rs index 39e14faa..2ad0c9be 100644 --- a/serde_test/src/de.rs +++ b/serde_test/src/de.rs @@ -85,12 +85,12 @@ impl Deserializer }) } - fn visit_struct(&mut self, len: Option, mut visitor: V) -> Result + fn visit_struct(&mut self, fields: &'static [&'static str], mut visitor: V) -> Result where V: Visitor, { visitor.visit_map(DeserializerStructVisitor { de: self, - len: len, + len: fields.len(), }) } @@ -433,7 +433,7 @@ impl de::Deserializer for Deserializer Some(&Token::StructStart(n, _)) => { self.tokens.next(); if name == n { - self.visit_struct(Some(fields.len()), visitor) + self.visit_struct(fields, visitor) } else { Err(Error::InvalidName(n)) } @@ -725,7 +725,7 @@ impl<'a, I> MapVisitor for DeserializerMapVisitor<'a, I> struct DeserializerStructVisitor<'a, I: 'a> where I: Iterator> { de: &'a mut Deserializer, - len: Option, + len: usize, } impl<'a, I> MapVisitor for DeserializerStructVisitor<'a, I> @@ -739,7 +739,7 @@ impl<'a, I> MapVisitor for DeserializerStructVisitor<'a, I> match self.de.tokens.peek() { Some(&Token::StructSep) => { self.de.tokens.next(); - self.len = self.len.map(|len| if len > 0 { len - 1} else { 0 }); + self.len = self.len.saturating_sub(1); Ok(Some(try!(Deserialize::deserialize(self.de)))) } Some(&Token::StructEnd) => Ok(None), @@ -767,8 +767,7 @@ impl<'a, I> MapVisitor for DeserializerStructVisitor<'a, I> } fn size_hint(&self) -> (usize, Option) { - let len = self.len.unwrap_or(0); - (len, self.len) + (self.len, Some(self.len)) } }