Exhaustive match in serde_test deserializer

This commit is contained in:
David Tolnay 2017-04-05 09:48:23 -07:00
parent a33a9a5b26
commit f03e8e6056
No known key found for this signature in database
GPG Key ID: F9BA143B95FF6D82

View File

@ -84,51 +84,52 @@ impl<'de, 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> {
fn deserialize<V>(self, visitor: V) -> Result<V::Value, Error> fn deserialize<V>(self, visitor: V) -> Result<V::Value, Error>
where V: Visitor<'de> where V: Visitor<'de>
{ {
match self.next_token() { let token = self.next_token().ok_or(Error::EndOfTokens)?;
Some(Token::Bool(v)) => visitor.visit_bool(v), match token {
Some(Token::I8(v)) => visitor.visit_i8(v), Token::Bool(v) => visitor.visit_bool(v),
Some(Token::I16(v)) => visitor.visit_i16(v), Token::I8(v) => visitor.visit_i8(v),
Some(Token::I32(v)) => visitor.visit_i32(v), Token::I16(v) => visitor.visit_i16(v),
Some(Token::I64(v)) => visitor.visit_i64(v), Token::I32(v) => visitor.visit_i32(v),
Some(Token::U8(v)) => visitor.visit_u8(v), Token::I64(v) => visitor.visit_i64(v),
Some(Token::U16(v)) => visitor.visit_u16(v), Token::U8(v) => visitor.visit_u8(v),
Some(Token::U32(v)) => visitor.visit_u32(v), Token::U16(v) => visitor.visit_u16(v),
Some(Token::U64(v)) => visitor.visit_u64(v), Token::U32(v) => visitor.visit_u32(v),
Some(Token::F32(v)) => visitor.visit_f32(v), Token::U64(v) => visitor.visit_u64(v),
Some(Token::F64(v)) => visitor.visit_f64(v), Token::F32(v) => visitor.visit_f32(v),
Some(Token::Char(v)) => visitor.visit_char(v), Token::F64(v) => visitor.visit_f64(v),
Some(Token::Str(v)) => visitor.visit_str(v), Token::Char(v) => visitor.visit_char(v),
Some(Token::BorrowedStr(v)) => visitor.visit_borrowed_str(v), Token::Str(v) => visitor.visit_str(v),
Some(Token::String(v)) => visitor.visit_string(v.to_owned()), Token::BorrowedStr(v) => visitor.visit_borrowed_str(v),
Some(Token::Bytes(v)) => visitor.visit_bytes(v), Token::String(v) => visitor.visit_string(v.to_owned()),
Some(Token::BorrowedBytes(v)) => visitor.visit_borrowed_bytes(v), Token::Bytes(v) => visitor.visit_bytes(v),
Some(Token::ByteBuf(v)) => visitor.visit_byte_buf(v.to_vec()), Token::BorrowedBytes(v) => visitor.visit_borrowed_bytes(v),
Some(Token::Option(false)) => visitor.visit_none(), Token::ByteBuf(v) => visitor.visit_byte_buf(v.to_vec()),
Some(Token::Option(true)) => visitor.visit_some(self), Token::Option(false) => visitor.visit_none(),
Some(Token::Unit) => visitor.visit_unit(), Token::Option(true) => visitor.visit_some(self),
Some(Token::UnitStruct(_name)) => visitor.visit_unit(), Token::Unit => visitor.visit_unit(),
Some(Token::StructNewType(_name)) => visitor.visit_newtype_struct(self), Token::UnitStruct(_name) => visitor.visit_unit(),
Some(Token::SeqStart(len)) => { Token::StructNewType(_name) => visitor.visit_newtype_struct(self),
Token::SeqStart(len) => {
self.visit_seq(len, Token::SeqEnd, visitor) self.visit_seq(len, Token::SeqEnd, visitor)
} }
Some(Token::SeqArrayStart(len)) => { Token::SeqArrayStart(len) => {
self.visit_seq(Some(len), Token::SeqEnd, visitor) self.visit_seq(Some(len), Token::SeqEnd, visitor)
} }
Some(Token::TupleStart(len)) => { Token::TupleStart(len) => {
self.visit_seq(Some(len), Token::TupleEnd, visitor) self.visit_seq(Some(len), Token::TupleEnd, visitor)
} }
Some(Token::TupleStructStart(_, len)) => { Token::TupleStructStart(_, len) => {
self.visit_seq(Some(len), self.visit_seq(Some(len),
Token::TupleStructEnd, Token::TupleStructEnd,
visitor) visitor)
} }
Some(Token::MapStart(len)) => { Token::MapStart(len) => {
self.visit_map(len, Token::MapEnd, visitor) self.visit_map(len, Token::MapEnd, visitor)
} }
Some(Token::StructStart(_, len)) => { Token::StructStart(_, len) => {
self.visit_map(Some(len), Token::StructEnd, visitor) self.visit_map(Some(len), Token::StructEnd, visitor)
} }
Some(Token::EnumStart(_)) => { Token::EnumStart(_) => {
let variant = self.next_token().ok_or(Error::EndOfTokens)?; let variant = self.next_token().ok_or(Error::EndOfTokens)?;
let next = *self.tokens.first().ok_or(Error::EndOfTokens)?; let next = *self.tokens.first().ok_or(Error::EndOfTokens)?;
match (variant, next) { match (variant, next) {
@ -152,18 +153,23 @@ impl<'de, 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> {
} }
} }
} }
Some(Token::EnumUnit(_, variant)) => visitor.visit_str(variant), Token::EnumUnit(_, variant) => visitor.visit_str(variant),
Some(Token::EnumNewType(_, variant)) => { Token::EnumNewType(_, variant) => {
visitor.visit_map(EnumMapVisitor::new(self, Token::Str(variant), EnumFormat::Any)) visitor.visit_map(EnumMapVisitor::new(self, Token::Str(variant), EnumFormat::Any))
} }
Some(Token::EnumSeqStart(_, variant, _)) => { Token::EnumSeqStart(_, variant, _) => {
visitor.visit_map(EnumMapVisitor::new(self, Token::Str(variant), EnumFormat::Seq)) visitor.visit_map(EnumMapVisitor::new(self, Token::Str(variant), EnumFormat::Seq))
} }
Some(Token::EnumMapStart(_, variant, _)) => { Token::EnumMapStart(_, variant, _) => {
visitor.visit_map(EnumMapVisitor::new(self, Token::Str(variant), EnumFormat::Map)) visitor.visit_map(EnumMapVisitor::new(self, Token::Str(variant), EnumFormat::Map))
} }
Some(token) => Err(Error::UnexpectedToken(token)), Token::SeqEnd |
None => Err(Error::EndOfTokens), Token::TupleEnd |
Token::TupleStructEnd |
Token::MapEnd |
Token::StructEnd |
Token::EnumSeqEnd |
Token::EnumMapEnd => Err(Error::UnexpectedToken(token)),
} }
} }