diff --git a/serde/src/private/de.rs b/serde/src/private/de.rs index 883e6909c..446912441 100644 --- a/serde/src/private/de.rs +++ b/serde/src/private/de.rs @@ -288,6 +288,55 @@ mod content { Content::Map(_) => Unexpected::Map, } } + + #[cold] + fn invalid_type(&self, exp: &Expected) -> E + where + E: de::Error, + { + de::Error::invalid_type(self.unexpected(), exp) + } + + fn deserialize_bool(&self, visitor: V) -> Result + where + V: Visitor<'de>, + E: de::Error, + { + match *self { + Content::Bool(v) => visitor.visit_bool(v), + _ => Err(self.invalid_type(&visitor)), + } + } + + fn deserialize_integer(&self, visitor: V) -> Result + where + V: Visitor<'de>, + E: de::Error, + { + match *self { + Content::U8(v) => visitor.visit_u8(v), + Content::U16(v) => visitor.visit_u16(v), + Content::U32(v) => visitor.visit_u32(v), + Content::U64(v) => visitor.visit_u64(v), + Content::I8(v) => visitor.visit_i8(v), + Content::I16(v) => visitor.visit_i16(v), + Content::I32(v) => visitor.visit_i32(v), + Content::I64(v) => visitor.visit_i64(v), + _ => Err(self.invalid_type(&visitor)), + } + } + + fn deserialize_float(&self, visitor: V) -> Result + where + V: Visitor<'de>, + E: de::Error, + { + match *self { + Content::F32(v) => visitor.visit_f32(v), + Content::F64(v) => visitor.visit_f64(v), + _ => self.deserialize_integer(visitor), + } + } } impl<'de> Deserialize<'de> for Content<'de> { @@ -1036,52 +1085,6 @@ mod content { err: PhantomData, } - impl<'de, E> ContentDeserializer<'de, E> - where - E: de::Error, - { - #[cold] - fn invalid_type(self, exp: &Expected) -> E { - de::Error::invalid_type(self.content.unexpected(), exp) - } - - fn deserialize_integer(self, visitor: V) -> Result - where - V: Visitor<'de>, - { - match self.content { - Content::U8(v) => visitor.visit_u8(v), - Content::U16(v) => visitor.visit_u16(v), - Content::U32(v) => visitor.visit_u32(v), - Content::U64(v) => visitor.visit_u64(v), - Content::I8(v) => visitor.visit_i8(v), - Content::I16(v) => visitor.visit_i16(v), - Content::I32(v) => visitor.visit_i32(v), - Content::I64(v) => visitor.visit_i64(v), - _ => Err(self.invalid_type(&visitor)), - } - } - - fn deserialize_float(self, visitor: V) -> Result - where - V: Visitor<'de>, - { - match self.content { - Content::F32(v) => visitor.visit_f32(v), - Content::F64(v) => visitor.visit_f64(v), - Content::U8(v) => visitor.visit_u8(v), - Content::U16(v) => visitor.visit_u16(v), - Content::U32(v) => visitor.visit_u32(v), - Content::U64(v) => visitor.visit_u64(v), - Content::I8(v) => visitor.visit_i8(v), - Content::I16(v) => visitor.visit_i16(v), - Content::I32(v) => visitor.visit_i32(v), - Content::I64(v) => visitor.visit_i64(v), - _ => Err(self.invalid_type(&visitor)), - } - } - } - fn visit_content_seq<'de, V, E>(content: Vec>, visitor: V) -> Result where V: Visitor<'de>, @@ -1153,80 +1156,77 @@ mod content { where V: Visitor<'de>, { - match self.content { - Content::Bool(v) => visitor.visit_bool(v), - _ => Err(self.invalid_type(&visitor)), - } + self.content.deserialize_bool(visitor) } fn deserialize_i8(self, visitor: V) -> Result where V: Visitor<'de>, { - self.deserialize_integer(visitor) + self.content.deserialize_integer(visitor) } fn deserialize_i16(self, visitor: V) -> Result where V: Visitor<'de>, { - self.deserialize_integer(visitor) + self.content.deserialize_integer(visitor) } fn deserialize_i32(self, visitor: V) -> Result where V: Visitor<'de>, { - self.deserialize_integer(visitor) + self.content.deserialize_integer(visitor) } fn deserialize_i64(self, visitor: V) -> Result where V: Visitor<'de>, { - self.deserialize_integer(visitor) + self.content.deserialize_integer(visitor) } fn deserialize_u8(self, visitor: V) -> Result where V: Visitor<'de>, { - self.deserialize_integer(visitor) + self.content.deserialize_integer(visitor) } fn deserialize_u16(self, visitor: V) -> Result where V: Visitor<'de>, { - self.deserialize_integer(visitor) + self.content.deserialize_integer(visitor) } fn deserialize_u32(self, visitor: V) -> Result where V: Visitor<'de>, { - self.deserialize_integer(visitor) + self.content.deserialize_integer(visitor) } fn deserialize_u64(self, visitor: V) -> Result where V: Visitor<'de>, { - self.deserialize_integer(visitor) + self.content.deserialize_integer(visitor) } fn deserialize_f32(self, visitor: V) -> Result where V: Visitor<'de>, { - self.deserialize_float(visitor) + self.content.deserialize_float(visitor) } fn deserialize_f64(self, visitor: V) -> Result where V: Visitor<'de>, { - self.deserialize_float(visitor) + self.content.deserialize_float(visitor) } fn deserialize_char(self, visitor: V) -> Result @@ -1237,7 +1237,7 @@ mod content { Content::Char(v) => visitor.visit_char(v), Content::String(v) => visitor.visit_string(v), Content::Str(v) => visitor.visit_borrowed_str(v), - _ => Err(self.invalid_type(&visitor)), + _ => Err(self.content.invalid_type(&visitor)), } } @@ -1257,7 +1257,7 @@ mod content { Content::Str(v) => visitor.visit_borrowed_str(v), Content::ByteBuf(v) => visitor.visit_byte_buf(v), Content::Bytes(v) => visitor.visit_borrowed_bytes(v), - _ => Err(self.invalid_type(&visitor)), + _ => Err(self.content.invalid_type(&visitor)), } } @@ -1278,7 +1278,7 @@ mod content { Content::ByteBuf(v) => visitor.visit_byte_buf(v), Content::Bytes(v) => visitor.visit_borrowed_bytes(v), Content::Seq(v) => visit_content_seq(v, visitor), - _ => Err(self.invalid_type(&visitor)), + _ => Err(self.content.invalid_type(&visitor)), } } @@ -1311,7 +1311,7 @@ mod content { // // We want {"result":"Success"} to deserialize into Response<()>. Content::Map(ref v) if v.is_empty() => visitor.visit_unit(), - _ => Err(self.invalid_type(&visitor)), + _ => Err(self.content.invalid_type(&visitor)), } } @@ -1364,7 +1364,7 @@ mod content { { match self.content { Content::Seq(v) => visit_content_seq(v, visitor), - _ => Err(self.invalid_type(&visitor)), + _ => Err(self.content.invalid_type(&visitor)), } } @@ -1393,7 +1393,7 @@ mod content { { match self.content { Content::Map(v) => visit_content_map(v, visitor), - _ => Err(self.invalid_type(&visitor)), + _ => Err(self.content.invalid_type(&visitor)), } } @@ -1409,7 +1409,7 @@ mod content { match self.content { Content::Seq(v) => visit_content_seq(v, visitor), Content::Map(v) => visit_content_map(v, visitor), - _ => Err(self.invalid_type(&visitor)), + _ => Err(self.content.invalid_type(&visitor)), } } @@ -1445,10 +1445,7 @@ mod content { } s @ Content::String(_) | s @ Content::Str(_) => (s, None), other => { - return Err(de::Error::invalid_type( - other.unexpected(), - &"string or map", - )); + return Err(other.invalid_type(&"string or map")); } }; @@ -1466,7 +1463,7 @@ mod content { Content::Bytes(v) => visitor.visit_borrowed_bytes(v), Content::U8(v) => visitor.visit_u8(v), Content::U64(v) => visitor.visit_u64(v), - _ => Err(self.invalid_type(&visitor)), + _ => Err(self.content.invalid_type(&visitor)), } } @@ -1585,10 +1582,7 @@ mod content { Some(Content::Seq(v)) => { de::Deserializer::deserialize_any(SeqDeserializer::new(v.into_iter()), visitor) } - Some(other) => Err(de::Error::invalid_type( - other.unexpected(), - &"tuple variant", - )), + Some(other) => Err(other.invalid_type(&"tuple variant")), None => Err(de::Error::invalid_type( de::Unexpected::UnitVariant, &"tuple variant", @@ -1611,10 +1605,7 @@ mod content { Some(Content::Seq(v)) => { de::Deserializer::deserialize_any(SeqDeserializer::new(v.into_iter()), visitor) } - Some(other) => Err(de::Error::invalid_type( - other.unexpected(), - &"struct variant", - )), + Some(other) => Err(other.invalid_type(&"struct variant")), None => Err(de::Error::invalid_type( de::Unexpected::UnitVariant, &"struct variant", @@ -1629,52 +1620,6 @@ mod content { err: PhantomData, } - impl<'a, 'de, E> ContentRefDeserializer<'a, 'de, E> - where - E: de::Error, - { - #[cold] - fn invalid_type(self, exp: &Expected) -> E { - de::Error::invalid_type(self.content.unexpected(), exp) - } - - fn deserialize_integer(self, visitor: V) -> Result - where - V: Visitor<'de>, - { - match *self.content { - Content::U8(v) => visitor.visit_u8(v), - Content::U16(v) => visitor.visit_u16(v), - Content::U32(v) => visitor.visit_u32(v), - Content::U64(v) => visitor.visit_u64(v), - Content::I8(v) => visitor.visit_i8(v), - Content::I16(v) => visitor.visit_i16(v), - Content::I32(v) => visitor.visit_i32(v), - Content::I64(v) => visitor.visit_i64(v), - _ => Err(self.invalid_type(&visitor)), - } - } - - fn deserialize_float(self, visitor: V) -> Result - where - V: Visitor<'de>, - { - match *self.content { - Content::F32(v) => visitor.visit_f32(v), - Content::F64(v) => visitor.visit_f64(v), - Content::U8(v) => visitor.visit_u8(v), - Content::U16(v) => visitor.visit_u16(v), - Content::U32(v) => visitor.visit_u32(v), - Content::U64(v) => visitor.visit_u64(v), - Content::I8(v) => visitor.visit_i8(v), - Content::I16(v) => visitor.visit_i16(v), - Content::I32(v) => visitor.visit_i32(v), - Content::I64(v) => visitor.visit_i64(v), - _ => Err(self.invalid_type(&visitor)), - } - } - } - fn visit_content_seq_ref<'a, 'de, V, E>( content: &'a [Content<'de>], visitor: V, @@ -1754,80 +1699,77 @@ mod content { where V: Visitor<'de>, { - match *self.content { - Content::Bool(v) => visitor.visit_bool(v), - _ => Err(self.invalid_type(&visitor)), - } + self.content.deserialize_bool(visitor) } fn deserialize_i8(self, visitor: V) -> Result where V: Visitor<'de>, { - self.deserialize_integer(visitor) + self.content.deserialize_integer(visitor) } fn deserialize_i16(self, visitor: V) -> Result where V: Visitor<'de>, { - self.deserialize_integer(visitor) + self.content.deserialize_integer(visitor) } fn deserialize_i32(self, visitor: V) -> Result where V: Visitor<'de>, { - self.deserialize_integer(visitor) + self.content.deserialize_integer(visitor) } fn deserialize_i64(self, visitor: V) -> Result where V: Visitor<'de>, { - self.deserialize_integer(visitor) + self.content.deserialize_integer(visitor) } fn deserialize_u8(self, visitor: V) -> Result where V: Visitor<'de>, { - self.deserialize_integer(visitor) + self.content.deserialize_integer(visitor) } fn deserialize_u16(self, visitor: V) -> Result where V: Visitor<'de>, { - self.deserialize_integer(visitor) + self.content.deserialize_integer(visitor) } fn deserialize_u32(self, visitor: V) -> Result where V: Visitor<'de>, { - self.deserialize_integer(visitor) + self.content.deserialize_integer(visitor) } fn deserialize_u64(self, visitor: V) -> Result where V: Visitor<'de>, { - self.deserialize_integer(visitor) + self.content.deserialize_integer(visitor) } fn deserialize_f32(self, visitor: V) -> Result where V: Visitor<'de>, { - self.deserialize_float(visitor) + self.content.deserialize_float(visitor) } fn deserialize_f64(self, visitor: V) -> Result where V: Visitor<'de>, { - self.deserialize_float(visitor) + self.content.deserialize_float(visitor) } fn deserialize_char(self, visitor: V) -> Result @@ -1838,7 +1780,7 @@ mod content { Content::Char(v) => visitor.visit_char(v), Content::String(ref v) => visitor.visit_str(v), Content::Str(v) => visitor.visit_borrowed_str(v), - _ => Err(self.invalid_type(&visitor)), + _ => Err(self.content.invalid_type(&visitor)), } } @@ -1851,7 +1793,7 @@ mod content { Content::Str(v) => visitor.visit_borrowed_str(v), Content::ByteBuf(ref v) => visitor.visit_bytes(v), Content::Bytes(v) => visitor.visit_borrowed_bytes(v), - _ => Err(self.invalid_type(&visitor)), + _ => Err(self.content.invalid_type(&visitor)), } } @@ -1872,7 +1814,7 @@ mod content { Content::ByteBuf(ref v) => visitor.visit_bytes(v), Content::Bytes(v) => visitor.visit_borrowed_bytes(v), Content::Seq(ref v) => visit_content_seq_ref(v, visitor), - _ => Err(self.invalid_type(&visitor)), + _ => Err(self.content.invalid_type(&visitor)), } } @@ -1901,7 +1843,7 @@ mod content { { match *self.content { Content::Unit => visitor.visit_unit(), - _ => Err(self.invalid_type(&visitor)), + _ => Err(self.content.invalid_type(&visitor)), } } @@ -1934,7 +1876,7 @@ mod content { { match *self.content { Content::Seq(ref v) => visit_content_seq_ref(v, visitor), - _ => Err(self.invalid_type(&visitor)), + _ => Err(self.content.invalid_type(&visitor)), } } @@ -1963,7 +1905,7 @@ mod content { { match *self.content { Content::Map(ref v) => visit_content_map_ref(v, visitor), - _ => Err(self.invalid_type(&visitor)), + _ => Err(self.content.invalid_type(&visitor)), } } @@ -1979,7 +1921,7 @@ mod content { match *self.content { Content::Seq(ref v) => visit_content_seq_ref(v, visitor), Content::Map(ref v) => visit_content_map_ref(v, visitor), - _ => Err(self.invalid_type(&visitor)), + _ => Err(self.content.invalid_type(&visitor)), } } @@ -2015,10 +1957,7 @@ mod content { } ref s @ Content::String(_) | ref s @ Content::Str(_) => (s, None), ref other => { - return Err(de::Error::invalid_type( - other.unexpected(), - &"string or map", - )); + return Err(other.invalid_type(&"string or map")); } }; @@ -2040,7 +1979,7 @@ mod content { Content::Bytes(v) => visitor.visit_borrowed_bytes(v), Content::U8(v) => visitor.visit_u8(v), Content::U64(v) => visitor.visit_u64(v), - _ => Err(self.invalid_type(&visitor)), + _ => Err(self.content.invalid_type(&visitor)), } } @@ -2153,10 +2092,7 @@ mod content { Some(Content::Seq(v)) => { de::Deserializer::deserialize_any(SeqRefDeserializer::new(v), visitor) } - Some(other) => Err(de::Error::invalid_type( - other.unexpected(), - &"tuple variant", - )), + Some(other) => Err(other.invalid_type(&"tuple variant")), None => Err(de::Error::invalid_type( de::Unexpected::UnitVariant, &"tuple variant", @@ -2179,10 +2115,7 @@ mod content { Some(Content::Seq(v)) => { de::Deserializer::deserialize_any(SeqRefDeserializer::new(v), visitor) } - Some(other) => Err(de::Error::invalid_type( - other.unexpected(), - &"struct variant", - )), + Some(other) => Err(other.invalid_type(&"struct variant")), None => Err(de::Error::invalid_type( de::Unexpected::UnitVariant, &"struct variant",