diff options
Diffstat (limited to 'vendor/serde/src/de/value.rs')
-rw-r--r-- | vendor/serde/src/de/value.rs | 1720 |
1 files changed, 0 insertions, 1720 deletions
diff --git a/vendor/serde/src/de/value.rs b/vendor/serde/src/de/value.rs deleted file mode 100644 index b229eba..0000000 --- a/vendor/serde/src/de/value.rs +++ /dev/null @@ -1,1720 +0,0 @@ -//! Building blocks for deserializing basic values using the `IntoDeserializer` -//! trait. -//! -//! ```edition2021 -//! use serde::de::{value, Deserialize, IntoDeserializer}; -//! use serde_derive::Deserialize; -//! use std::str::FromStr; -//! -//! #[derive(Deserialize)] -//! enum Setting { -//! On, -//! Off, -//! } -//! -//! impl FromStr for Setting { -//! type Err = value::Error; -//! -//! fn from_str(s: &str) -> Result<Self, Self::Err> { -//! Self::deserialize(s.into_deserializer()) -//! } -//! } -//! ``` - -use crate::lib::*; - -use self::private::{First, Second}; -use crate::de::{self, size_hint, Deserializer, Expected, IntoDeserializer, SeqAccess, Visitor}; -use crate::ser; - -//////////////////////////////////////////////////////////////////////////////// - -// For structs that contain a PhantomData. We do not want the trait -// bound `E: Clone` inferred by derive(Clone). -macro_rules! impl_copy_clone { - ($ty:ident $(<$lifetime:tt>)*) => { - impl<$($lifetime,)* E> Copy for $ty<$($lifetime,)* E> {} - - impl<$($lifetime,)* E> Clone for $ty<$($lifetime,)* E> { - fn clone(&self) -> Self { - *self - } - } - }; -} - -//////////////////////////////////////////////////////////////////////////////// - -/// A minimal representation of all possible errors that can occur using the -/// `IntoDeserializer` trait. -#[derive(Clone, PartialEq)] -pub struct Error { - err: ErrorImpl, -} - -#[cfg(any(feature = "std", feature = "alloc"))] -type ErrorImpl = Box<str>; -#[cfg(not(any(feature = "std", feature = "alloc")))] -type ErrorImpl = (); - -impl de::Error for Error { - #[cfg(any(feature = "std", feature = "alloc"))] - #[cold] - fn custom<T>(msg: T) -> Self - where - T: Display, - { - Error { - err: msg.to_string().into_boxed_str(), - } - } - - #[cfg(not(any(feature = "std", feature = "alloc")))] - #[cold] - fn custom<T>(msg: T) -> Self - where - T: Display, - { - let _ = msg; - Error { err: () } - } -} - -impl ser::Error for Error { - #[cold] - fn custom<T>(msg: T) -> Self - where - T: Display, - { - de::Error::custom(msg) - } -} - -impl Display for Error { - #[cfg(any(feature = "std", feature = "alloc"))] - fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str(&self.err) - } - - #[cfg(not(any(feature = "std", feature = "alloc")))] - fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str("Serde deserialization error") - } -} - -impl Debug for Error { - fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - let mut debug = formatter.debug_tuple("Error"); - #[cfg(any(feature = "std", feature = "alloc"))] - debug.field(&self.err); - debug.finish() - } -} - -#[cfg(feature = "std")] -#[cfg_attr(doc_cfg, doc(cfg(feature = "std")))] -impl error::Error for Error { - fn description(&self) -> &str { - &self.err - } -} - -//////////////////////////////////////////////////////////////////////////////// - -impl<'de, E> IntoDeserializer<'de, E> for () -where - E: de::Error, -{ - type Deserializer = UnitDeserializer<E>; - - fn into_deserializer(self) -> UnitDeserializer<E> { - UnitDeserializer::new() - } -} - -/// A deserializer holding a `()`. -pub struct UnitDeserializer<E> { - marker: PhantomData<E>, -} - -impl_copy_clone!(UnitDeserializer); - -impl<E> UnitDeserializer<E> { - #[allow(missing_docs)] - pub fn new() -> Self { - UnitDeserializer { - marker: PhantomData, - } - } -} - -impl<'de, E> de::Deserializer<'de> for UnitDeserializer<E> -where - E: de::Error, -{ - type Error = E; - - forward_to_deserialize_any! { - bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string - bytes byte_buf unit unit_struct newtype_struct seq tuple tuple_struct - map struct enum identifier ignored_any - } - - fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: de::Visitor<'de>, - { - visitor.visit_unit() - } - - fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: de::Visitor<'de>, - { - visitor.visit_none() - } -} - -impl<E> Debug for UnitDeserializer<E> { - fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.debug_struct("UnitDeserializer").finish() - } -} - -//////////////////////////////////////////////////////////////////////////////// - -/// A deserializer that cannot be instantiated. -#[cfg(feature = "unstable")] -#[cfg_attr(doc_cfg, doc(cfg(feature = "unstable")))] -pub struct NeverDeserializer<E> { - never: !, - marker: PhantomData<E>, -} - -#[cfg(feature = "unstable")] -#[cfg_attr(doc_cfg, doc(cfg(feature = "unstable")))] -impl<'de, E> IntoDeserializer<'de, E> for ! -where - E: de::Error, -{ - type Deserializer = NeverDeserializer<E>; - - fn into_deserializer(self) -> Self::Deserializer { - self - } -} - -#[cfg(feature = "unstable")] -impl<'de, E> de::Deserializer<'de> for NeverDeserializer<E> -where - E: de::Error, -{ - type Error = E; - - fn deserialize_any<V>(self, _visitor: V) -> Result<V::Value, Self::Error> - where - V: de::Visitor<'de>, - { - self.never - } - - forward_to_deserialize_any! { - bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string - bytes byte_buf option unit unit_struct newtype_struct seq tuple - tuple_struct map struct enum identifier ignored_any - } -} - -//////////////////////////////////////////////////////////////////////////////// - -macro_rules! primitive_deserializer { - ($ty:ty, $doc:tt, $name:ident, $method:ident $($cast:tt)*) => { - #[doc = "A deserializer holding"] - #[doc = $doc] - pub struct $name<E> { - value: $ty, - marker: PhantomData<E> - } - - impl_copy_clone!($name); - - impl<'de, E> IntoDeserializer<'de, E> for $ty - where - E: de::Error, - { - type Deserializer = $name<E>; - - fn into_deserializer(self) -> $name<E> { - $name::new(self) - } - } - - impl<E> $name<E> { - #[allow(missing_docs)] - pub fn new(value: $ty) -> Self { - $name { - value, - marker: PhantomData, - } - } - } - - impl<'de, E> de::Deserializer<'de> for $name<E> - where - E: de::Error, - { - type Error = E; - - forward_to_deserialize_any! { - bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str - string bytes byte_buf option unit unit_struct newtype_struct seq - tuple tuple_struct map struct enum identifier ignored_any - } - - fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: de::Visitor<'de>, - { - visitor.$method(self.value $($cast)*) - } - } - - impl<E> Debug for $name<E> { - fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter - .debug_struct(stringify!($name)) - .field("value", &self.value) - .finish() - } - } - } -} - -primitive_deserializer!(bool, "a `bool`.", BoolDeserializer, visit_bool); -primitive_deserializer!(i8, "an `i8`.", I8Deserializer, visit_i8); -primitive_deserializer!(i16, "an `i16`.", I16Deserializer, visit_i16); -primitive_deserializer!(i32, "an `i32`.", I32Deserializer, visit_i32); -primitive_deserializer!(i64, "an `i64`.", I64Deserializer, visit_i64); -primitive_deserializer!(i128, "an `i128`.", I128Deserializer, visit_i128); -primitive_deserializer!(isize, "an `isize`.", IsizeDeserializer, visit_i64 as i64); -primitive_deserializer!(u8, "a `u8`.", U8Deserializer, visit_u8); -primitive_deserializer!(u16, "a `u16`.", U16Deserializer, visit_u16); -primitive_deserializer!(u64, "a `u64`.", U64Deserializer, visit_u64); -primitive_deserializer!(u128, "a `u128`.", U128Deserializer, visit_u128); -primitive_deserializer!(usize, "a `usize`.", UsizeDeserializer, visit_u64 as u64); -primitive_deserializer!(f32, "an `f32`.", F32Deserializer, visit_f32); -primitive_deserializer!(f64, "an `f64`.", F64Deserializer, visit_f64); -primitive_deserializer!(char, "a `char`.", CharDeserializer, visit_char); - -/// A deserializer holding a `u32`. -pub struct U32Deserializer<E> { - value: u32, - marker: PhantomData<E>, -} - -impl_copy_clone!(U32Deserializer); - -impl<'de, E> IntoDeserializer<'de, E> for u32 -where - E: de::Error, -{ - type Deserializer = U32Deserializer<E>; - - fn into_deserializer(self) -> U32Deserializer<E> { - U32Deserializer::new(self) - } -} - -impl<E> U32Deserializer<E> { - #[allow(missing_docs)] - pub fn new(value: u32) -> Self { - U32Deserializer { - value, - marker: PhantomData, - } - } -} - -impl<'de, E> de::Deserializer<'de> for U32Deserializer<E> -where - E: de::Error, -{ - type Error = E; - - forward_to_deserialize_any! { - bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string - bytes byte_buf option unit unit_struct newtype_struct seq tuple - tuple_struct map struct identifier ignored_any - } - - fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: de::Visitor<'de>, - { - visitor.visit_u32(self.value) - } - - fn deserialize_enum<V>( - self, - name: &str, - variants: &'static [&'static str], - visitor: V, - ) -> Result<V::Value, Self::Error> - where - V: de::Visitor<'de>, - { - let _ = name; - let _ = variants; - visitor.visit_enum(self) - } -} - -impl<'de, E> de::EnumAccess<'de> for U32Deserializer<E> -where - E: de::Error, -{ - type Error = E; - type Variant = private::UnitOnly<E>; - - fn variant_seed<T>(self, seed: T) -> Result<(T::Value, Self::Variant), Self::Error> - where - T: de::DeserializeSeed<'de>, - { - seed.deserialize(self).map(private::unit_only) - } -} - -impl<E> Debug for U32Deserializer<E> { - fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter - .debug_struct("U32Deserializer") - .field("value", &self.value) - .finish() - } -} - -//////////////////////////////////////////////////////////////////////////////// - -/// A deserializer holding a `&str`. -pub struct StrDeserializer<'a, E> { - value: &'a str, - marker: PhantomData<E>, -} - -impl_copy_clone!(StrDeserializer<'de>); - -impl<'de, 'a, E> IntoDeserializer<'de, E> for &'a str -where - E: de::Error, -{ - type Deserializer = StrDeserializer<'a, E>; - - fn into_deserializer(self) -> StrDeserializer<'a, E> { - StrDeserializer::new(self) - } -} - -impl<'a, E> StrDeserializer<'a, E> { - #[allow(missing_docs)] - pub fn new(value: &'a str) -> Self { - StrDeserializer { - value, - marker: PhantomData, - } - } -} - -impl<'de, 'a, E> de::Deserializer<'de> for StrDeserializer<'a, E> -where - E: de::Error, -{ - type Error = E; - - fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: de::Visitor<'de>, - { - visitor.visit_str(self.value) - } - - fn deserialize_enum<V>( - self, - name: &str, - variants: &'static [&'static str], - visitor: V, - ) -> Result<V::Value, Self::Error> - where - V: de::Visitor<'de>, - { - let _ = name; - let _ = variants; - visitor.visit_enum(self) - } - - forward_to_deserialize_any! { - bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string - bytes byte_buf option unit unit_struct newtype_struct seq tuple - tuple_struct map struct identifier ignored_any - } -} - -impl<'de, 'a, E> de::EnumAccess<'de> for StrDeserializer<'a, E> -where - E: de::Error, -{ - type Error = E; - type Variant = private::UnitOnly<E>; - - fn variant_seed<T>(self, seed: T) -> Result<(T::Value, Self::Variant), Self::Error> - where - T: de::DeserializeSeed<'de>, - { - seed.deserialize(self).map(private::unit_only) - } -} - -impl<'a, E> Debug for StrDeserializer<'a, E> { - fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter - .debug_struct("StrDeserializer") - .field("value", &self.value) - .finish() - } -} - -//////////////////////////////////////////////////////////////////////////////// - -/// A deserializer holding a `&str` with a lifetime tied to another -/// deserializer. -pub struct BorrowedStrDeserializer<'de, E> { - value: &'de str, - marker: PhantomData<E>, -} - -impl_copy_clone!(BorrowedStrDeserializer<'de>); - -impl<'de, E> BorrowedStrDeserializer<'de, E> { - /// Create a new borrowed deserializer from the given string. - pub fn new(value: &'de str) -> BorrowedStrDeserializer<'de, E> { - BorrowedStrDeserializer { - value, - marker: PhantomData, - } - } -} - -impl<'de, E> de::Deserializer<'de> for BorrowedStrDeserializer<'de, E> -where - E: de::Error, -{ - type Error = E; - - fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: de::Visitor<'de>, - { - visitor.visit_borrowed_str(self.value) - } - - fn deserialize_enum<V>( - self, - name: &str, - variants: &'static [&'static str], - visitor: V, - ) -> Result<V::Value, Self::Error> - where - V: de::Visitor<'de>, - { - let _ = name; - let _ = variants; - visitor.visit_enum(self) - } - - forward_to_deserialize_any! { - bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string - bytes byte_buf option unit unit_struct newtype_struct seq tuple - tuple_struct map struct identifier ignored_any - } -} - -impl<'de, E> de::EnumAccess<'de> for BorrowedStrDeserializer<'de, E> -where - E: de::Error, -{ - type Error = E; - type Variant = private::UnitOnly<E>; - - fn variant_seed<T>(self, seed: T) -> Result<(T::Value, Self::Variant), Self::Error> - where - T: de::DeserializeSeed<'de>, - { - seed.deserialize(self).map(private::unit_only) - } -} - -impl<'de, E> Debug for BorrowedStrDeserializer<'de, E> { - fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter - .debug_struct("BorrowedStrDeserializer") - .field("value", &self.value) - .finish() - } -} - -//////////////////////////////////////////////////////////////////////////////// - -/// A deserializer holding a `String`. -#[cfg(any(feature = "std", feature = "alloc"))] -#[cfg_attr(doc_cfg, doc(cfg(any(feature = "std", feature = "alloc"))))] -pub struct StringDeserializer<E> { - value: String, - marker: PhantomData<E>, -} - -#[cfg(any(feature = "std", feature = "alloc"))] -impl<E> Clone for StringDeserializer<E> { - fn clone(&self) -> Self { - StringDeserializer { - value: self.value.clone(), - marker: PhantomData, - } - } -} - -#[cfg(any(feature = "std", feature = "alloc"))] -#[cfg_attr(doc_cfg, doc(cfg(any(feature = "std", feature = "alloc"))))] -impl<'de, E> IntoDeserializer<'de, E> for String -where - E: de::Error, -{ - type Deserializer = StringDeserializer<E>; - - fn into_deserializer(self) -> StringDeserializer<E> { - StringDeserializer::new(self) - } -} - -#[cfg(any(feature = "std", feature = "alloc"))] -impl<E> StringDeserializer<E> { - #[allow(missing_docs)] - pub fn new(value: String) -> Self { - StringDeserializer { - value, - marker: PhantomData, - } - } -} - -#[cfg(any(feature = "std", feature = "alloc"))] -impl<'de, E> de::Deserializer<'de> for StringDeserializer<E> -where - E: de::Error, -{ - type Error = E; - - fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: de::Visitor<'de>, - { - visitor.visit_string(self.value) - } - - fn deserialize_enum<V>( - self, - name: &str, - variants: &'static [&'static str], - visitor: V, - ) -> Result<V::Value, Self::Error> - where - V: de::Visitor<'de>, - { - let _ = name; - let _ = variants; - visitor.visit_enum(self) - } - - forward_to_deserialize_any! { - bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string - bytes byte_buf option unit unit_struct newtype_struct seq tuple - tuple_struct map struct identifier ignored_any - } -} - -#[cfg(any(feature = "std", feature = "alloc"))] -impl<'de, E> de::EnumAccess<'de> for StringDeserializer<E> -where - E: de::Error, -{ - type Error = E; - type Variant = private::UnitOnly<E>; - - fn variant_seed<T>(self, seed: T) -> Result<(T::Value, Self::Variant), Self::Error> - where - T: de::DeserializeSeed<'de>, - { - seed.deserialize(self).map(private::unit_only) - } -} - -#[cfg(any(feature = "std", feature = "alloc"))] -impl<E> Debug for StringDeserializer<E> { - fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter - .debug_struct("StringDeserializer") - .field("value", &self.value) - .finish() - } -} - -//////////////////////////////////////////////////////////////////////////////// - -/// A deserializer holding a `Cow<str>`. -#[cfg(any(feature = "std", feature = "alloc"))] -#[cfg_attr(doc_cfg, doc(cfg(any(feature = "std", feature = "alloc"))))] -pub struct CowStrDeserializer<'a, E> { - value: Cow<'a, str>, - marker: PhantomData<E>, -} - -#[cfg(any(feature = "std", feature = "alloc"))] -impl<'a, E> Clone for CowStrDeserializer<'a, E> { - fn clone(&self) -> Self { - CowStrDeserializer { - value: self.value.clone(), - marker: PhantomData, - } - } -} - -#[cfg(any(feature = "std", feature = "alloc"))] -#[cfg_attr(doc_cfg, doc(cfg(any(feature = "std", feature = "alloc"))))] -impl<'de, 'a, E> IntoDeserializer<'de, E> for Cow<'a, str> -where - E: de::Error, -{ - type Deserializer = CowStrDeserializer<'a, E>; - - fn into_deserializer(self) -> CowStrDeserializer<'a, E> { - CowStrDeserializer::new(self) - } -} - -#[cfg(any(feature = "std", feature = "alloc"))] -impl<'a, E> CowStrDeserializer<'a, E> { - #[allow(missing_docs)] - pub fn new(value: Cow<'a, str>) -> Self { - CowStrDeserializer { - value, - marker: PhantomData, - } - } -} - -#[cfg(any(feature = "std", feature = "alloc"))] -impl<'de, 'a, E> de::Deserializer<'de> for CowStrDeserializer<'a, E> -where - E: de::Error, -{ - type Error = E; - - fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: de::Visitor<'de>, - { - match self.value { - Cow::Borrowed(string) => visitor.visit_str(string), - Cow::Owned(string) => visitor.visit_string(string), - } - } - - fn deserialize_enum<V>( - self, - name: &str, - variants: &'static [&'static str], - visitor: V, - ) -> Result<V::Value, Self::Error> - where - V: de::Visitor<'de>, - { - let _ = name; - let _ = variants; - visitor.visit_enum(self) - } - - forward_to_deserialize_any! { - bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string - bytes byte_buf option unit unit_struct newtype_struct seq tuple - tuple_struct map struct identifier ignored_any - } -} - -#[cfg(any(feature = "std", feature = "alloc"))] -impl<'de, 'a, E> de::EnumAccess<'de> for CowStrDeserializer<'a, E> -where - E: de::Error, -{ - type Error = E; - type Variant = private::UnitOnly<E>; - - fn variant_seed<T>(self, seed: T) -> Result<(T::Value, Self::Variant), Self::Error> - where - T: de::DeserializeSeed<'de>, - { - seed.deserialize(self).map(private::unit_only) - } -} - -#[cfg(any(feature = "std", feature = "alloc"))] -impl<'a, E> Debug for CowStrDeserializer<'a, E> { - fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter - .debug_struct("CowStrDeserializer") - .field("value", &self.value) - .finish() - } -} - -//////////////////////////////////////////////////////////////////////////////// - -/// A deserializer holding a `&[u8]`. Always calls [`Visitor::visit_bytes`]. -pub struct BytesDeserializer<'a, E> { - value: &'a [u8], - marker: PhantomData<E>, -} - -impl<'a, E> BytesDeserializer<'a, E> { - /// Create a new deserializer from the given bytes. - pub fn new(value: &'a [u8]) -> Self { - BytesDeserializer { - value, - marker: PhantomData, - } - } -} - -impl_copy_clone!(BytesDeserializer<'a>); - -impl<'de, 'a, E> IntoDeserializer<'de, E> for &'a [u8] -where - E: de::Error, -{ - type Deserializer = BytesDeserializer<'a, E>; - - fn into_deserializer(self) -> BytesDeserializer<'a, E> { - BytesDeserializer::new(self) - } -} - -impl<'de, 'a, E> Deserializer<'de> for BytesDeserializer<'a, E> -where - E: de::Error, -{ - type Error = E; - - fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - visitor.visit_bytes(self.value) - } - - forward_to_deserialize_any! { - bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string - bytes byte_buf option unit unit_struct newtype_struct seq tuple - tuple_struct map struct enum identifier ignored_any - } -} - -impl<'a, E> Debug for BytesDeserializer<'a, E> { - fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter - .debug_struct("BytesDeserializer") - .field("value", &self.value) - .finish() - } -} - -/// A deserializer holding a `&[u8]` with a lifetime tied to another -/// deserializer. Always calls [`Visitor::visit_borrowed_bytes`]. -pub struct BorrowedBytesDeserializer<'de, E> { - value: &'de [u8], - marker: PhantomData<E>, -} - -impl<'de, E> BorrowedBytesDeserializer<'de, E> { - /// Create a new borrowed deserializer from the given borrowed bytes. - pub fn new(value: &'de [u8]) -> Self { - BorrowedBytesDeserializer { - value, - marker: PhantomData, - } - } -} - -impl_copy_clone!(BorrowedBytesDeserializer<'de>); - -impl<'de, E> Deserializer<'de> for BorrowedBytesDeserializer<'de, E> -where - E: de::Error, -{ - type Error = E; - - fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - visitor.visit_borrowed_bytes(self.value) - } - - forward_to_deserialize_any! { - bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string - bytes byte_buf option unit unit_struct newtype_struct seq tuple - tuple_struct map struct enum identifier ignored_any - } -} - -impl<'de, E> Debug for BorrowedBytesDeserializer<'de, E> { - fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter - .debug_struct("BorrowedBytesDeserializer") - .field("value", &self.value) - .finish() - } -} - -//////////////////////////////////////////////////////////////////////////////// - -/// A deserializer that iterates over a sequence. -#[derive(Clone)] -pub struct SeqDeserializer<I, E> { - iter: iter::Fuse<I>, - count: usize, - marker: PhantomData<E>, -} - -impl<I, E> SeqDeserializer<I, E> -where - I: Iterator, -{ - /// Construct a new `SeqDeserializer<I, E>`. - pub fn new(iter: I) -> Self { - SeqDeserializer { - iter: iter.fuse(), - count: 0, - marker: PhantomData, - } - } -} - -impl<I, E> SeqDeserializer<I, E> -where - I: Iterator, - E: de::Error, -{ - /// Check for remaining elements after passing a `SeqDeserializer` to - /// `Visitor::visit_seq`. - pub fn end(self) -> Result<(), E> { - let remaining = self.iter.count(); - if remaining == 0 { - Ok(()) - } else { - // First argument is the number of elements in the data, second - // argument is the number of elements expected by the Deserialize. - Err(de::Error::invalid_length( - self.count + remaining, - &ExpectedInSeq(self.count), - )) - } - } -} - -impl<'de, I, T, E> de::Deserializer<'de> for SeqDeserializer<I, E> -where - I: Iterator<Item = T>, - T: IntoDeserializer<'de, E>, - E: de::Error, -{ - type Error = E; - - fn deserialize_any<V>(mut self, visitor: V) -> Result<V::Value, Self::Error> - where - V: de::Visitor<'de>, - { - let v = tri!(visitor.visit_seq(&mut self)); - tri!(self.end()); - Ok(v) - } - - forward_to_deserialize_any! { - bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string - bytes byte_buf option unit unit_struct newtype_struct seq tuple - tuple_struct map struct enum identifier ignored_any - } -} - -impl<'de, I, T, E> de::SeqAccess<'de> for SeqDeserializer<I, E> -where - I: Iterator<Item = T>, - T: IntoDeserializer<'de, E>, - E: de::Error, -{ - type Error = E; - - fn next_element_seed<V>(&mut self, seed: V) -> Result<Option<V::Value>, Self::Error> - where - V: de::DeserializeSeed<'de>, - { - match self.iter.next() { - Some(value) => { - self.count += 1; - seed.deserialize(value.into_deserializer()).map(Some) - } - None => Ok(None), - } - } - - fn size_hint(&self) -> Option<usize> { - size_hint::from_bounds(&self.iter) - } -} - -struct ExpectedInSeq(usize); - -impl Expected for ExpectedInSeq { - fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - if self.0 == 1 { - write!(formatter, "1 element in sequence") - } else { - write!(formatter, "{} elements in sequence", self.0) - } - } -} - -impl<I, E> Debug for SeqDeserializer<I, E> -where - I: Debug, -{ - fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter - .debug_struct("SeqDeserializer") - .field("iter", &self.iter) - .field("count", &self.count) - .finish() - } -} - -//////////////////////////////////////////////////////////////////////////////// - -#[cfg(any(feature = "std", feature = "alloc"))] -#[cfg_attr(doc_cfg, doc(cfg(any(feature = "std", feature = "alloc"))))] -impl<'de, T, E> IntoDeserializer<'de, E> for Vec<T> -where - T: IntoDeserializer<'de, E>, - E: de::Error, -{ - type Deserializer = SeqDeserializer<<Self as IntoIterator>::IntoIter, E>; - - fn into_deserializer(self) -> Self::Deserializer { - SeqDeserializer::new(self.into_iter()) - } -} - -#[cfg(any(feature = "std", feature = "alloc"))] -#[cfg_attr(doc_cfg, doc(cfg(any(feature = "std", feature = "alloc"))))] -impl<'de, T, E> IntoDeserializer<'de, E> for BTreeSet<T> -where - T: IntoDeserializer<'de, E> + Eq + Ord, - E: de::Error, -{ - type Deserializer = SeqDeserializer<<Self as IntoIterator>::IntoIter, E>; - - fn into_deserializer(self) -> Self::Deserializer { - SeqDeserializer::new(self.into_iter()) - } -} - -#[cfg(feature = "std")] -#[cfg_attr(doc_cfg, doc(cfg(feature = "std")))] -impl<'de, T, S, E> IntoDeserializer<'de, E> for HashSet<T, S> -where - T: IntoDeserializer<'de, E> + Eq + Hash, - S: BuildHasher, - E: de::Error, -{ - type Deserializer = SeqDeserializer<<Self as IntoIterator>::IntoIter, E>; - - fn into_deserializer(self) -> Self::Deserializer { - SeqDeserializer::new(self.into_iter()) - } -} - -//////////////////////////////////////////////////////////////////////////////// - -/// A deserializer holding a `SeqAccess`. -#[derive(Clone, Debug)] -pub struct SeqAccessDeserializer<A> { - seq: A, -} - -impl<A> SeqAccessDeserializer<A> { - /// Construct a new `SeqAccessDeserializer<A>`. - pub fn new(seq: A) -> Self { - SeqAccessDeserializer { seq } - } -} - -impl<'de, A> de::Deserializer<'de> for SeqAccessDeserializer<A> -where - A: de::SeqAccess<'de>, -{ - type Error = A::Error; - - fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: de::Visitor<'de>, - { - visitor.visit_seq(self.seq) - } - - forward_to_deserialize_any! { - bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string - bytes byte_buf option unit unit_struct newtype_struct seq tuple - tuple_struct map struct enum identifier ignored_any - } -} - -//////////////////////////////////////////////////////////////////////////////// - -/// A deserializer that iterates over a map. -pub struct MapDeserializer<'de, I, E> -where - I: Iterator, - I::Item: private::Pair, -{ - iter: iter::Fuse<I>, - value: Option<Second<I::Item>>, - count: usize, - lifetime: PhantomData<&'de ()>, - error: PhantomData<E>, -} - -impl<'de, I, E> MapDeserializer<'de, I, E> -where - I: Iterator, - I::Item: private::Pair, -{ - /// Construct a new `MapDeserializer<I, E>`. - pub fn new(iter: I) -> Self { - MapDeserializer { - iter: iter.fuse(), - value: None, - count: 0, - lifetime: PhantomData, - error: PhantomData, - } - } -} - -impl<'de, I, E> MapDeserializer<'de, I, E> -where - I: Iterator, - I::Item: private::Pair, - E: de::Error, -{ - /// Check for remaining elements after passing a `MapDeserializer` to - /// `Visitor::visit_map`. - pub fn end(self) -> Result<(), E> { - let remaining = self.iter.count(); - if remaining == 0 { - Ok(()) - } else { - // First argument is the number of elements in the data, second - // argument is the number of elements expected by the Deserialize. - Err(de::Error::invalid_length( - self.count + remaining, - &ExpectedInMap(self.count), - )) - } - } -} - -impl<'de, I, E> MapDeserializer<'de, I, E> -where - I: Iterator, - I::Item: private::Pair, -{ - fn next_pair(&mut self) -> Option<(First<I::Item>, Second<I::Item>)> { - match self.iter.next() { - Some(kv) => { - self.count += 1; - Some(private::Pair::split(kv)) - } - None => None, - } - } -} - -impl<'de, I, E> de::Deserializer<'de> for MapDeserializer<'de, I, E> -where - I: Iterator, - I::Item: private::Pair, - First<I::Item>: IntoDeserializer<'de, E>, - Second<I::Item>: IntoDeserializer<'de, E>, - E: de::Error, -{ - type Error = E; - - fn deserialize_any<V>(mut self, visitor: V) -> Result<V::Value, Self::Error> - where - V: de::Visitor<'de>, - { - let value = tri!(visitor.visit_map(&mut self)); - tri!(self.end()); - Ok(value) - } - - fn deserialize_seq<V>(mut self, visitor: V) -> Result<V::Value, Self::Error> - where - V: de::Visitor<'de>, - { - let value = tri!(visitor.visit_seq(&mut self)); - tri!(self.end()); - Ok(value) - } - - fn deserialize_tuple<V>(self, len: usize, visitor: V) -> Result<V::Value, Self::Error> - where - V: de::Visitor<'de>, - { - let _ = len; - self.deserialize_seq(visitor) - } - - forward_to_deserialize_any! { - bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string - bytes byte_buf option unit unit_struct newtype_struct tuple_struct map - struct enum identifier ignored_any - } -} - -impl<'de, I, E> de::MapAccess<'de> for MapDeserializer<'de, I, E> -where - I: Iterator, - I::Item: private::Pair, - First<I::Item>: IntoDeserializer<'de, E>, - Second<I::Item>: IntoDeserializer<'de, E>, - E: de::Error, -{ - type Error = E; - - fn next_key_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error> - where - T: de::DeserializeSeed<'de>, - { - match self.next_pair() { - Some((key, value)) => { - self.value = Some(value); - seed.deserialize(key.into_deserializer()).map(Some) - } - None => Ok(None), - } - } - - fn next_value_seed<T>(&mut self, seed: T) -> Result<T::Value, Self::Error> - where - T: de::DeserializeSeed<'de>, - { - let value = self.value.take(); - // Panic because this indicates a bug in the program rather than an - // expected failure. - let value = value.expect("MapAccess::next_value called before next_key"); - seed.deserialize(value.into_deserializer()) - } - - fn next_entry_seed<TK, TV>( - &mut self, - kseed: TK, - vseed: TV, - ) -> Result<Option<(TK::Value, TV::Value)>, Self::Error> - where - TK: de::DeserializeSeed<'de>, - TV: de::DeserializeSeed<'de>, - { - match self.next_pair() { - Some((key, value)) => { - let key = tri!(kseed.deserialize(key.into_deserializer())); - let value = tri!(vseed.deserialize(value.into_deserializer())); - Ok(Some((key, value))) - } - None => Ok(None), - } - } - - fn size_hint(&self) -> Option<usize> { - size_hint::from_bounds(&self.iter) - } -} - -impl<'de, I, E> de::SeqAccess<'de> for MapDeserializer<'de, I, E> -where - I: Iterator, - I::Item: private::Pair, - First<I::Item>: IntoDeserializer<'de, E>, - Second<I::Item>: IntoDeserializer<'de, E>, - E: de::Error, -{ - type Error = E; - - fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error> - where - T: de::DeserializeSeed<'de>, - { - match self.next_pair() { - Some((k, v)) => { - let de = PairDeserializer(k, v, PhantomData); - seed.deserialize(de).map(Some) - } - None => Ok(None), - } - } - - fn size_hint(&self) -> Option<usize> { - size_hint::from_bounds(&self.iter) - } -} - -// Cannot #[derive(Clone)] because of the bound `Second<I::Item>: Clone`. -impl<'de, I, E> Clone for MapDeserializer<'de, I, E> -where - I: Iterator + Clone, - I::Item: private::Pair, - Second<I::Item>: Clone, -{ - fn clone(&self) -> Self { - MapDeserializer { - iter: self.iter.clone(), - value: self.value.clone(), - count: self.count, - lifetime: self.lifetime, - error: self.error, - } - } -} - -impl<'de, I, E> Debug for MapDeserializer<'de, I, E> -where - I: Iterator + Debug, - I::Item: private::Pair, - Second<I::Item>: Debug, -{ - fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter - .debug_struct("MapDeserializer") - .field("iter", &self.iter) - .field("value", &self.value) - .field("count", &self.count) - .finish() - } -} - -// Used in the `impl SeqAccess for MapDeserializer` to visit the map as a -// sequence of pairs. -struct PairDeserializer<A, B, E>(A, B, PhantomData<E>); - -impl<'de, A, B, E> de::Deserializer<'de> for PairDeserializer<A, B, E> -where - A: IntoDeserializer<'de, E>, - B: IntoDeserializer<'de, E>, - E: de::Error, -{ - type Error = E; - - forward_to_deserialize_any! { - bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string - bytes byte_buf option unit unit_struct newtype_struct tuple_struct map - struct enum identifier ignored_any - } - - fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: de::Visitor<'de>, - { - self.deserialize_seq(visitor) - } - - fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: de::Visitor<'de>, - { - let mut pair_visitor = PairVisitor(Some(self.0), Some(self.1), PhantomData); - let pair = tri!(visitor.visit_seq(&mut pair_visitor)); - if pair_visitor.1.is_none() { - Ok(pair) - } else { - let remaining = pair_visitor.size_hint().unwrap(); - // First argument is the number of elements in the data, second - // argument is the number of elements expected by the Deserialize. - Err(de::Error::invalid_length(2, &ExpectedInSeq(2 - remaining))) - } - } - - fn deserialize_tuple<V>(self, len: usize, visitor: V) -> Result<V::Value, Self::Error> - where - V: de::Visitor<'de>, - { - if len == 2 { - self.deserialize_seq(visitor) - } else { - // First argument is the number of elements in the data, second - // argument is the number of elements expected by the Deserialize. - Err(de::Error::invalid_length(2, &ExpectedInSeq(len))) - } - } -} - -struct PairVisitor<A, B, E>(Option<A>, Option<B>, PhantomData<E>); - -impl<'de, A, B, E> de::SeqAccess<'de> for PairVisitor<A, B, E> -where - A: IntoDeserializer<'de, E>, - B: IntoDeserializer<'de, E>, - E: de::Error, -{ - type Error = E; - - fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error> - where - T: de::DeserializeSeed<'de>, - { - if let Some(k) = self.0.take() { - seed.deserialize(k.into_deserializer()).map(Some) - } else if let Some(v) = self.1.take() { - seed.deserialize(v.into_deserializer()).map(Some) - } else { - Ok(None) - } - } - - fn size_hint(&self) -> Option<usize> { - if self.0.is_some() { - Some(2) - } else if self.1.is_some() { - Some(1) - } else { - Some(0) - } - } -} - -struct ExpectedInMap(usize); - -impl Expected for ExpectedInMap { - fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - if self.0 == 1 { - write!(formatter, "1 element in map") - } else { - write!(formatter, "{} elements in map", self.0) - } - } -} - -//////////////////////////////////////////////////////////////////////////////// - -#[cfg(any(feature = "std", feature = "alloc"))] -#[cfg_attr(doc_cfg, doc(cfg(any(feature = "std", feature = "alloc"))))] -impl<'de, K, V, E> IntoDeserializer<'de, E> for BTreeMap<K, V> -where - K: IntoDeserializer<'de, E> + Eq + Ord, - V: IntoDeserializer<'de, E>, - E: de::Error, -{ - type Deserializer = MapDeserializer<'de, <Self as IntoIterator>::IntoIter, E>; - - fn into_deserializer(self) -> Self::Deserializer { - MapDeserializer::new(self.into_iter()) - } -} - -#[cfg(feature = "std")] -#[cfg_attr(doc_cfg, doc(cfg(feature = "std")))] -impl<'de, K, V, S, E> IntoDeserializer<'de, E> for HashMap<K, V, S> -where - K: IntoDeserializer<'de, E> + Eq + Hash, - V: IntoDeserializer<'de, E>, - S: BuildHasher, - E: de::Error, -{ - type Deserializer = MapDeserializer<'de, <Self as IntoIterator>::IntoIter, E>; - - fn into_deserializer(self) -> Self::Deserializer { - MapDeserializer::new(self.into_iter()) - } -} - -//////////////////////////////////////////////////////////////////////////////// - -/// A deserializer holding a `MapAccess`. -#[derive(Clone, Debug)] -pub struct MapAccessDeserializer<A> { - map: A, -} - -impl<A> MapAccessDeserializer<A> { - /// Construct a new `MapAccessDeserializer<A>`. - pub fn new(map: A) -> Self { - MapAccessDeserializer { map } - } -} - -impl<'de, A> de::Deserializer<'de> for MapAccessDeserializer<A> -where - A: de::MapAccess<'de>, -{ - type Error = A::Error; - - fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: de::Visitor<'de>, - { - visitor.visit_map(self.map) - } - - fn deserialize_enum<V>( - self, - _name: &str, - _variants: &'static [&'static str], - visitor: V, - ) -> Result<V::Value, Self::Error> - where - V: de::Visitor<'de>, - { - visitor.visit_enum(self) - } - - forward_to_deserialize_any! { - bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string - bytes byte_buf option unit unit_struct newtype_struct seq tuple - tuple_struct map struct identifier ignored_any - } -} - -impl<'de, A> de::EnumAccess<'de> for MapAccessDeserializer<A> -where - A: de::MapAccess<'de>, -{ - type Error = A::Error; - type Variant = private::MapAsEnum<A>; - - fn variant_seed<T>(mut self, seed: T) -> Result<(T::Value, Self::Variant), Self::Error> - where - T: de::DeserializeSeed<'de>, - { - match tri!(self.map.next_key_seed(seed)) { - Some(key) => Ok((key, private::map_as_enum(self.map))), - None => Err(de::Error::invalid_type(de::Unexpected::Map, &"enum")), - } - } -} - -//////////////////////////////////////////////////////////////////////////////// - -/// A deserializer holding an `EnumAccess`. -#[derive(Clone, Debug)] -pub struct EnumAccessDeserializer<A> { - access: A, -} - -impl<A> EnumAccessDeserializer<A> { - /// Construct a new `EnumAccessDeserializer<A>`. - pub fn new(access: A) -> Self { - EnumAccessDeserializer { access } - } -} - -impl<'de, A> de::Deserializer<'de> for EnumAccessDeserializer<A> -where - A: de::EnumAccess<'de>, -{ - type Error = A::Error; - - fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: de::Visitor<'de>, - { - visitor.visit_enum(self.access) - } - - forward_to_deserialize_any! { - bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string - bytes byte_buf option unit unit_struct newtype_struct seq tuple - tuple_struct map struct enum identifier ignored_any - } -} - -//////////////////////////////////////////////////////////////////////////////// - -mod private { - use crate::lib::*; - - use crate::de::{ - self, DeserializeSeed, Deserializer, MapAccess, Unexpected, VariantAccess, Visitor, - }; - - pub struct UnitOnly<E> { - marker: PhantomData<E>, - } - - pub fn unit_only<T, E>(t: T) -> (T, UnitOnly<E>) { - ( - t, - UnitOnly { - marker: PhantomData, - }, - ) - } - - impl<'de, E> de::VariantAccess<'de> for UnitOnly<E> - where - E: de::Error, - { - type Error = E; - - fn unit_variant(self) -> Result<(), Self::Error> { - Ok(()) - } - - fn newtype_variant_seed<T>(self, _seed: T) -> Result<T::Value, Self::Error> - where - T: de::DeserializeSeed<'de>, - { - Err(de::Error::invalid_type( - Unexpected::UnitVariant, - &"newtype variant", - )) - } - - fn tuple_variant<V>(self, _len: usize, _visitor: V) -> Result<V::Value, Self::Error> - where - V: de::Visitor<'de>, - { - Err(de::Error::invalid_type( - Unexpected::UnitVariant, - &"tuple variant", - )) - } - - fn struct_variant<V>( - self, - _fields: &'static [&'static str], - _visitor: V, - ) -> Result<V::Value, Self::Error> - where - V: de::Visitor<'de>, - { - Err(de::Error::invalid_type( - Unexpected::UnitVariant, - &"struct variant", - )) - } - } - - pub struct MapAsEnum<A> { - map: A, - } - - pub fn map_as_enum<A>(map: A) -> MapAsEnum<A> { - MapAsEnum { map } - } - - impl<'de, A> VariantAccess<'de> for MapAsEnum<A> - where - A: MapAccess<'de>, - { - type Error = A::Error; - - fn unit_variant(mut self) -> Result<(), Self::Error> { - self.map.next_value() - } - - fn newtype_variant_seed<T>(mut self, seed: T) -> Result<T::Value, Self::Error> - where - T: DeserializeSeed<'de>, - { - self.map.next_value_seed(seed) - } - - fn tuple_variant<V>(mut self, len: usize, visitor: V) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - self.map.next_value_seed(SeedTupleVariant { len, visitor }) - } - - fn struct_variant<V>( - mut self, - _fields: &'static [&'static str], - visitor: V, - ) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - self.map.next_value_seed(SeedStructVariant { visitor }) - } - } - - struct SeedTupleVariant<V> { - len: usize, - visitor: V, - } - - impl<'de, V> DeserializeSeed<'de> for SeedTupleVariant<V> - where - V: Visitor<'de>, - { - type Value = V::Value; - - fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error> - where - D: Deserializer<'de>, - { - deserializer.deserialize_tuple(self.len, self.visitor) - } - } - - struct SeedStructVariant<V> { - visitor: V, - } - - impl<'de, V> DeserializeSeed<'de> for SeedStructVariant<V> - where - V: Visitor<'de>, - { - type Value = V::Value; - - fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error> - where - D: Deserializer<'de>, - { - deserializer.deserialize_map(self.visitor) - } - } - - /// Avoid having to restate the generic types on `MapDeserializer`. The - /// `Iterator::Item` contains enough information to figure out K and V. - pub trait Pair { - type First; - type Second; - fn split(self) -> (Self::First, Self::Second); - } - - impl<A, B> Pair for (A, B) { - type First = A; - type Second = B; - fn split(self) -> (A, B) { - self - } - } - - pub type First<T> = <T as Pair>::First; - pub type Second<T> = <T as Pair>::Second; -} |