diff options
Diffstat (limited to 'vendor/serde/src/de/impls.rs')
-rw-r--r-- | vendor/serde/src/de/impls.rs | 3071 |
1 files changed, 0 insertions, 3071 deletions
diff --git a/vendor/serde/src/de/impls.rs b/vendor/serde/src/de/impls.rs deleted file mode 100644 index 413c997..0000000 --- a/vendor/serde/src/de/impls.rs +++ /dev/null @@ -1,3071 +0,0 @@ -use crate::lib::*; - -use crate::de::{ - Deserialize, Deserializer, EnumAccess, Error, MapAccess, SeqAccess, Unexpected, VariantAccess, - Visitor, -}; - -use crate::seed::InPlaceSeed; - -#[cfg(any(feature = "std", feature = "alloc"))] -use crate::de::size_hint; - -//////////////////////////////////////////////////////////////////////////////// - -struct UnitVisitor; - -impl<'de> Visitor<'de> for UnitVisitor { - type Value = (); - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str("unit") - } - - fn visit_unit<E>(self) -> Result<Self::Value, E> - where - E: Error, - { - Ok(()) - } -} - -impl<'de> Deserialize<'de> for () { - fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> - where - D: Deserializer<'de>, - { - deserializer.deserialize_unit(UnitVisitor) - } -} - -#[cfg(feature = "unstable")] -#[cfg_attr(doc_cfg, doc(cfg(feature = "unstable")))] -impl<'de> Deserialize<'de> for ! { - fn deserialize<D>(_deserializer: D) -> Result<Self, D::Error> - where - D: Deserializer<'de>, - { - Err(Error::custom("cannot deserialize `!`")) - } -} - -//////////////////////////////////////////////////////////////////////////////// - -struct BoolVisitor; - -impl<'de> Visitor<'de> for BoolVisitor { - type Value = bool; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str("a boolean") - } - - fn visit_bool<E>(self, v: bool) -> Result<Self::Value, E> - where - E: Error, - { - Ok(v) - } -} - -impl<'de> Deserialize<'de> for bool { - fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> - where - D: Deserializer<'de>, - { - deserializer.deserialize_bool(BoolVisitor) - } -} - -//////////////////////////////////////////////////////////////////////////////// - -macro_rules! impl_deserialize_num { - ($primitive:ident, $nonzero:ident $(cfg($($cfg:tt)*))*, $deserialize:ident $($method:ident!($($val:ident : $visit:ident)*);)*) => { - impl_deserialize_num!($primitive, $deserialize $($method!($($val : $visit)*);)*); - - $(#[cfg($($cfg)*)])* - impl<'de> Deserialize<'de> for num::$nonzero { - fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> - where - D: Deserializer<'de>, - { - struct NonZeroVisitor; - - impl<'de> Visitor<'de> for NonZeroVisitor { - type Value = num::$nonzero; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str(concat!("a nonzero ", stringify!($primitive))) - } - - $($($method!(nonzero $primitive $val : $visit);)*)* - } - - deserializer.$deserialize(NonZeroVisitor) - } - } - }; - - ($primitive:ident, $deserialize:ident $($method:ident!($($val:ident : $visit:ident)*);)*) => { - impl<'de> Deserialize<'de> for $primitive { - #[inline] - fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> - where - D: Deserializer<'de>, - { - struct PrimitiveVisitor; - - impl<'de> Visitor<'de> for PrimitiveVisitor { - type Value = $primitive; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str(stringify!($primitive)) - } - - $($($method!($val : $visit);)*)* - } - - deserializer.$deserialize(PrimitiveVisitor) - } - } - }; -} - -macro_rules! num_self { - ($ty:ident : $visit:ident) => { - #[inline] - fn $visit<E>(self, v: $ty) -> Result<Self::Value, E> - where - E: Error, - { - Ok(v) - } - }; - - (nonzero $primitive:ident $ty:ident : $visit:ident) => { - fn $visit<E>(self, v: $ty) -> Result<Self::Value, E> - where - E: Error, - { - if let Some(nonzero) = Self::Value::new(v) { - Ok(nonzero) - } else { - Err(Error::invalid_value(Unexpected::Unsigned(0), &self)) - } - } - }; -} - -macro_rules! num_as_self { - ($ty:ident : $visit:ident) => { - #[inline] - fn $visit<E>(self, v: $ty) -> Result<Self::Value, E> - where - E: Error, - { - Ok(v as Self::Value) - } - }; - - (nonzero $primitive:ident $ty:ident : $visit:ident) => { - fn $visit<E>(self, v: $ty) -> Result<Self::Value, E> - where - E: Error, - { - if let Some(nonzero) = Self::Value::new(v as $primitive) { - Ok(nonzero) - } else { - Err(Error::invalid_value(Unexpected::Unsigned(0), &self)) - } - } - }; -} - -macro_rules! num_as_copysign_self { - ($ty:ident : $visit:ident) => { - #[inline] - fn $visit<E>(self, v: $ty) -> Result<Self::Value, E> - where - E: Error, - { - #[cfg(any(no_float_copysign, not(feature = "std")))] - { - Ok(v as Self::Value) - } - - #[cfg(all(not(no_float_copysign), feature = "std"))] - { - // Preserve sign of NaN. The `as` produces a nondeterministic sign. - let sign = if v.is_sign_positive() { 1.0 } else { -1.0 }; - Ok((v as Self::Value).copysign(sign)) - } - } - }; -} - -macro_rules! int_to_int { - ($ty:ident : $visit:ident) => { - #[inline] - fn $visit<E>(self, v: $ty) -> Result<Self::Value, E> - where - E: Error, - { - if Self::Value::min_value() as i64 <= v as i64 - && v as i64 <= Self::Value::max_value() as i64 - { - Ok(v as Self::Value) - } else { - Err(Error::invalid_value(Unexpected::Signed(v as i64), &self)) - } - } - }; - - (nonzero $primitive:ident $ty:ident : $visit:ident) => { - fn $visit<E>(self, v: $ty) -> Result<Self::Value, E> - where - E: Error, - { - if $primitive::min_value() as i64 <= v as i64 - && v as i64 <= $primitive::max_value() as i64 - { - if let Some(nonzero) = Self::Value::new(v as $primitive) { - return Ok(nonzero); - } - } - Err(Error::invalid_value(Unexpected::Signed(v as i64), &self)) - } - }; -} - -macro_rules! int_to_uint { - ($ty:ident : $visit:ident) => { - #[inline] - fn $visit<E>(self, v: $ty) -> Result<Self::Value, E> - where - E: Error, - { - if 0 <= v && v as u64 <= Self::Value::max_value() as u64 { - Ok(v as Self::Value) - } else { - Err(Error::invalid_value(Unexpected::Signed(v as i64), &self)) - } - } - }; - - (nonzero $primitive:ident $ty:ident : $visit:ident) => { - fn $visit<E>(self, v: $ty) -> Result<Self::Value, E> - where - E: Error, - { - if 0 < v && v as u64 <= $primitive::max_value() as u64 { - if let Some(nonzero) = Self::Value::new(v as $primitive) { - return Ok(nonzero); - } - } - Err(Error::invalid_value(Unexpected::Signed(v as i64), &self)) - } - }; -} - -macro_rules! uint_to_self { - ($ty:ident : $visit:ident) => { - #[inline] - fn $visit<E>(self, v: $ty) -> Result<Self::Value, E> - where - E: Error, - { - if v as u64 <= Self::Value::max_value() as u64 { - Ok(v as Self::Value) - } else { - Err(Error::invalid_value(Unexpected::Unsigned(v as u64), &self)) - } - } - }; - - (nonzero $primitive:ident $ty:ident : $visit:ident) => { - fn $visit<E>(self, v: $ty) -> Result<Self::Value, E> - where - E: Error, - { - if v as u64 <= $primitive::max_value() as u64 { - if let Some(nonzero) = Self::Value::new(v as $primitive) { - return Ok(nonzero); - } - } - Err(Error::invalid_value(Unexpected::Unsigned(v as u64), &self)) - } - }; -} - -impl_deserialize_num! { - i8, NonZeroI8 cfg(not(no_num_nonzero_signed)), deserialize_i8 - num_self!(i8:visit_i8); - int_to_int!(i16:visit_i16 i32:visit_i32 i64:visit_i64); - uint_to_self!(u8:visit_u8 u16:visit_u16 u32:visit_u32 u64:visit_u64); -} - -impl_deserialize_num! { - i16, NonZeroI16 cfg(not(no_num_nonzero_signed)), deserialize_i16 - num_self!(i16:visit_i16); - num_as_self!(i8:visit_i8); - int_to_int!(i32:visit_i32 i64:visit_i64); - uint_to_self!(u8:visit_u8 u16:visit_u16 u32:visit_u32 u64:visit_u64); -} - -impl_deserialize_num! { - i32, NonZeroI32 cfg(not(no_num_nonzero_signed)), deserialize_i32 - num_self!(i32:visit_i32); - num_as_self!(i8:visit_i8 i16:visit_i16); - int_to_int!(i64:visit_i64); - uint_to_self!(u8:visit_u8 u16:visit_u16 u32:visit_u32 u64:visit_u64); -} - -impl_deserialize_num! { - i64, NonZeroI64 cfg(not(no_num_nonzero_signed)), deserialize_i64 - num_self!(i64:visit_i64); - num_as_self!(i8:visit_i8 i16:visit_i16 i32:visit_i32); - uint_to_self!(u8:visit_u8 u16:visit_u16 u32:visit_u32 u64:visit_u64); -} - -impl_deserialize_num! { - isize, NonZeroIsize cfg(not(no_num_nonzero_signed)), deserialize_i64 - num_as_self!(i8:visit_i8 i16:visit_i16); - int_to_int!(i32:visit_i32 i64:visit_i64); - uint_to_self!(u8:visit_u8 u16:visit_u16 u32:visit_u32 u64:visit_u64); -} - -impl_deserialize_num! { - u8, NonZeroU8, deserialize_u8 - num_self!(u8:visit_u8); - int_to_uint!(i8:visit_i8 i16:visit_i16 i32:visit_i32 i64:visit_i64); - uint_to_self!(u16:visit_u16 u32:visit_u32 u64:visit_u64); -} - -impl_deserialize_num! { - u16, NonZeroU16, deserialize_u16 - num_self!(u16:visit_u16); - num_as_self!(u8:visit_u8); - int_to_uint!(i8:visit_i8 i16:visit_i16 i32:visit_i32 i64:visit_i64); - uint_to_self!(u32:visit_u32 u64:visit_u64); -} - -impl_deserialize_num! { - u32, NonZeroU32, deserialize_u32 - num_self!(u32:visit_u32); - num_as_self!(u8:visit_u8 u16:visit_u16); - int_to_uint!(i8:visit_i8 i16:visit_i16 i32:visit_i32 i64:visit_i64); - uint_to_self!(u64:visit_u64); -} - -impl_deserialize_num! { - u64, NonZeroU64, deserialize_u64 - num_self!(u64:visit_u64); - num_as_self!(u8:visit_u8 u16:visit_u16 u32:visit_u32); - int_to_uint!(i8:visit_i8 i16:visit_i16 i32:visit_i32 i64:visit_i64); -} - -impl_deserialize_num! { - usize, NonZeroUsize, deserialize_u64 - num_as_self!(u8:visit_u8 u16:visit_u16); - int_to_uint!(i8:visit_i8 i16:visit_i16 i32:visit_i32 i64:visit_i64); - uint_to_self!(u32:visit_u32 u64:visit_u64); -} - -impl_deserialize_num! { - f32, deserialize_f32 - num_self!(f32:visit_f32); - num_as_copysign_self!(f64:visit_f64); - num_as_self!(i8:visit_i8 i16:visit_i16 i32:visit_i32 i64:visit_i64); - num_as_self!(u8:visit_u8 u16:visit_u16 u32:visit_u32 u64:visit_u64); -} - -impl_deserialize_num! { - f64, deserialize_f64 - num_self!(f64:visit_f64); - num_as_copysign_self!(f32:visit_f32); - num_as_self!(i8:visit_i8 i16:visit_i16 i32:visit_i32 i64:visit_i64); - num_as_self!(u8:visit_u8 u16:visit_u16 u32:visit_u32 u64:visit_u64); -} - -macro_rules! num_128 { - ($ty:ident : $visit:ident) => { - fn $visit<E>(self, v: $ty) -> Result<Self::Value, E> - where - E: Error, - { - if v as i128 >= Self::Value::min_value() as i128 - && v as u128 <= Self::Value::max_value() as u128 - { - Ok(v as Self::Value) - } else { - Err(Error::invalid_value( - Unexpected::Other(stringify!($ty)), - &self, - )) - } - } - }; - - (nonzero $primitive:ident $ty:ident : $visit:ident) => { - fn $visit<E>(self, v: $ty) -> Result<Self::Value, E> - where - E: Error, - { - if v as i128 >= $primitive::min_value() as i128 - && v as u128 <= $primitive::max_value() as u128 - { - if let Some(nonzero) = Self::Value::new(v as $primitive) { - Ok(nonzero) - } else { - Err(Error::invalid_value(Unexpected::Unsigned(0), &self)) - } - } else { - Err(Error::invalid_value( - Unexpected::Other(stringify!($ty)), - &self, - )) - } - } - }; -} - -impl_deserialize_num! { - i128, NonZeroI128 cfg(not(no_num_nonzero_signed)), deserialize_i128 - num_self!(i128:visit_i128); - num_as_self!(i8:visit_i8 i16:visit_i16 i32:visit_i32 i64:visit_i64); - num_as_self!(u8:visit_u8 u16:visit_u16 u32:visit_u32 u64:visit_u64); - num_128!(u128:visit_u128); -} - -impl_deserialize_num! { - u128, NonZeroU128, deserialize_u128 - num_self!(u128:visit_u128); - num_as_self!(u8:visit_u8 u16:visit_u16 u32:visit_u32 u64:visit_u64); - int_to_uint!(i8:visit_i8 i16:visit_i16 i32:visit_i32 i64:visit_i64); - num_128!(i128:visit_i128); -} - -//////////////////////////////////////////////////////////////////////////////// - -struct CharVisitor; - -impl<'de> Visitor<'de> for CharVisitor { - type Value = char; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str("a character") - } - - #[inline] - fn visit_char<E>(self, v: char) -> Result<Self::Value, E> - where - E: Error, - { - Ok(v) - } - - #[inline] - fn visit_str<E>(self, v: &str) -> Result<Self::Value, E> - where - E: Error, - { - let mut iter = v.chars(); - match (iter.next(), iter.next()) { - (Some(c), None) => Ok(c), - _ => Err(Error::invalid_value(Unexpected::Str(v), &self)), - } - } -} - -impl<'de> Deserialize<'de> for char { - #[inline] - fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> - where - D: Deserializer<'de>, - { - deserializer.deserialize_char(CharVisitor) - } -} - -//////////////////////////////////////////////////////////////////////////////// - -#[cfg(any(feature = "std", feature = "alloc"))] -struct StringVisitor; -#[cfg(any(feature = "std", feature = "alloc"))] -struct StringInPlaceVisitor<'a>(&'a mut String); - -#[cfg(any(feature = "std", feature = "alloc"))] -impl<'de> Visitor<'de> for StringVisitor { - type Value = String; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str("a string") - } - - fn visit_str<E>(self, v: &str) -> Result<Self::Value, E> - where - E: Error, - { - Ok(v.to_owned()) - } - - fn visit_string<E>(self, v: String) -> Result<Self::Value, E> - where - E: Error, - { - Ok(v) - } - - fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E> - where - E: Error, - { - match str::from_utf8(v) { - Ok(s) => Ok(s.to_owned()), - Err(_) => Err(Error::invalid_value(Unexpected::Bytes(v), &self)), - } - } - - fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E> - where - E: Error, - { - match String::from_utf8(v) { - Ok(s) => Ok(s), - Err(e) => Err(Error::invalid_value( - Unexpected::Bytes(&e.into_bytes()), - &self, - )), - } - } -} - -#[cfg(any(feature = "std", feature = "alloc"))] -impl<'a, 'de> Visitor<'de> for StringInPlaceVisitor<'a> { - type Value = (); - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str("a string") - } - - fn visit_str<E>(self, v: &str) -> Result<Self::Value, E> - where - E: Error, - { - self.0.clear(); - self.0.push_str(v); - Ok(()) - } - - fn visit_string<E>(self, v: String) -> Result<Self::Value, E> - where - E: Error, - { - *self.0 = v; - Ok(()) - } - - fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E> - where - E: Error, - { - match str::from_utf8(v) { - Ok(s) => { - self.0.clear(); - self.0.push_str(s); - Ok(()) - } - Err(_) => Err(Error::invalid_value(Unexpected::Bytes(v), &self)), - } - } - - fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E> - where - E: Error, - { - match String::from_utf8(v) { - Ok(s) => { - *self.0 = s; - Ok(()) - } - Err(e) => Err(Error::invalid_value( - Unexpected::Bytes(&e.into_bytes()), - &self, - )), - } - } -} - -#[cfg(any(feature = "std", feature = "alloc"))] -#[cfg_attr(doc_cfg, doc(cfg(any(feature = "std", feature = "alloc"))))] -impl<'de> Deserialize<'de> for String { - fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> - where - D: Deserializer<'de>, - { - deserializer.deserialize_string(StringVisitor) - } - - fn deserialize_in_place<D>(deserializer: D, place: &mut Self) -> Result<(), D::Error> - where - D: Deserializer<'de>, - { - deserializer.deserialize_string(StringInPlaceVisitor(place)) - } -} - -//////////////////////////////////////////////////////////////////////////////// - -struct StrVisitor; - -impl<'a> Visitor<'a> for StrVisitor { - type Value = &'a str; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str("a borrowed string") - } - - fn visit_borrowed_str<E>(self, v: &'a str) -> Result<Self::Value, E> - where - E: Error, - { - Ok(v) // so easy - } - - fn visit_borrowed_bytes<E>(self, v: &'a [u8]) -> Result<Self::Value, E> - where - E: Error, - { - str::from_utf8(v).map_err(|_| Error::invalid_value(Unexpected::Bytes(v), &self)) - } -} - -impl<'de: 'a, 'a> Deserialize<'de> for &'a str { - fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> - where - D: Deserializer<'de>, - { - deserializer.deserialize_str(StrVisitor) - } -} - -//////////////////////////////////////////////////////////////////////////////// - -struct BytesVisitor; - -impl<'a> Visitor<'a> for BytesVisitor { - type Value = &'a [u8]; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str("a borrowed byte array") - } - - fn visit_borrowed_bytes<E>(self, v: &'a [u8]) -> Result<Self::Value, E> - where - E: Error, - { - Ok(v) - } - - fn visit_borrowed_str<E>(self, v: &'a str) -> Result<Self::Value, E> - where - E: Error, - { - Ok(v.as_bytes()) - } -} - -impl<'de: 'a, 'a> Deserialize<'de> for &'a [u8] { - fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> - where - D: Deserializer<'de>, - { - deserializer.deserialize_bytes(BytesVisitor) - } -} - -//////////////////////////////////////////////////////////////////////////////// - -#[cfg(any(feature = "std", all(not(no_core_cstr), feature = "alloc")))] -struct CStringVisitor; - -#[cfg(any(feature = "std", all(not(no_core_cstr), feature = "alloc")))] -impl<'de> Visitor<'de> for CStringVisitor { - type Value = CString; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str("byte array") - } - - fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error> - where - A: SeqAccess<'de>, - { - let capacity = size_hint::cautious::<u8>(seq.size_hint()); - let mut values = Vec::<u8>::with_capacity(capacity); - - while let Some(value) = tri!(seq.next_element()) { - values.push(value); - } - - CString::new(values).map_err(Error::custom) - } - - fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E> - where - E: Error, - { - CString::new(v).map_err(Error::custom) - } - - fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E> - where - E: Error, - { - CString::new(v).map_err(Error::custom) - } - - fn visit_str<E>(self, v: &str) -> Result<Self::Value, E> - where - E: Error, - { - CString::new(v).map_err(Error::custom) - } - - fn visit_string<E>(self, v: String) -> Result<Self::Value, E> - where - E: Error, - { - CString::new(v).map_err(Error::custom) - } -} - -#[cfg(any(feature = "std", all(not(no_core_cstr), feature = "alloc")))] -#[cfg_attr(doc_cfg, doc(cfg(any(feature = "std", feature = "alloc"))))] -impl<'de> Deserialize<'de> for CString { - fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> - where - D: Deserializer<'de>, - { - deserializer.deserialize_byte_buf(CStringVisitor) - } -} - -macro_rules! forwarded_impl { - ( - $(#[$attr:meta])* - ($($id:ident),*), $ty:ty, $func:expr - ) => { - $(#[$attr])* - impl<'de $(, $id : Deserialize<'de>,)*> Deserialize<'de> for $ty { - fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> - where - D: Deserializer<'de>, - { - Deserialize::deserialize(deserializer).map($func) - } - } - } -} - -forwarded_impl! { - #[cfg(any(feature = "std", all(not(no_core_cstr), feature = "alloc")))] - #[cfg_attr(doc_cfg, doc(cfg(any(feature = "std", feature = "alloc"))))] - (), Box<CStr>, CString::into_boxed_c_str -} - -forwarded_impl! { - (T), Reverse<T>, Reverse -} - -//////////////////////////////////////////////////////////////////////////////// - -struct OptionVisitor<T> { - marker: PhantomData<T>, -} - -impl<'de, T> Visitor<'de> for OptionVisitor<T> -where - T: Deserialize<'de>, -{ - type Value = Option<T>; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str("option") - } - - #[inline] - fn visit_unit<E>(self) -> Result<Self::Value, E> - where - E: Error, - { - Ok(None) - } - - #[inline] - fn visit_none<E>(self) -> Result<Self::Value, E> - where - E: Error, - { - Ok(None) - } - - #[inline] - fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error> - where - D: Deserializer<'de>, - { - T::deserialize(deserializer).map(Some) - } - - fn __private_visit_untagged_option<D>(self, deserializer: D) -> Result<Self::Value, ()> - where - D: Deserializer<'de>, - { - Ok(T::deserialize(deserializer).ok()) - } -} - -impl<'de, T> Deserialize<'de> for Option<T> -where - T: Deserialize<'de>, -{ - fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> - where - D: Deserializer<'de>, - { - deserializer.deserialize_option(OptionVisitor { - marker: PhantomData, - }) - } - - // The Some variant's repr is opaque, so we can't play cute tricks with its - // tag to have deserialize_in_place build the content in place unconditionally. - // - // FIXME: investigate whether branching on the old value being Some to - // deserialize_in_place the value is profitable (probably data-dependent?) -} - -//////////////////////////////////////////////////////////////////////////////// - -struct PhantomDataVisitor<T: ?Sized> { - marker: PhantomData<T>, -} - -impl<'de, T: ?Sized> Visitor<'de> for PhantomDataVisitor<T> { - type Value = PhantomData<T>; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str("unit") - } - - #[inline] - fn visit_unit<E>(self) -> Result<Self::Value, E> - where - E: Error, - { - Ok(PhantomData) - } -} - -impl<'de, T: ?Sized> Deserialize<'de> for PhantomData<T> { - fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> - where - D: Deserializer<'de>, - { - let visitor = PhantomDataVisitor { - marker: PhantomData, - }; - deserializer.deserialize_unit_struct("PhantomData", visitor) - } -} - -//////////////////////////////////////////////////////////////////////////////// - -macro_rules! seq_impl { - ( - $(#[$attr:meta])* - $ty:ident <T $(: $tbound1:ident $(+ $tbound2:ident)*)* $(, $typaram:ident : $bound1:ident $(+ $bound2:ident)*)*>, - $access:ident, - $clear:expr, - $with_capacity:expr, - $reserve:expr, - $insert:expr - ) => { - $(#[$attr])* - impl<'de, T $(, $typaram)*> Deserialize<'de> for $ty<T $(, $typaram)*> - where - T: Deserialize<'de> $(+ $tbound1 $(+ $tbound2)*)*, - $($typaram: $bound1 $(+ $bound2)*,)* - { - fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> - where - D: Deserializer<'de>, - { - struct SeqVisitor<T $(, $typaram)*> { - marker: PhantomData<$ty<T $(, $typaram)*>>, - } - - impl<'de, T $(, $typaram)*> Visitor<'de> for SeqVisitor<T $(, $typaram)*> - where - T: Deserialize<'de> $(+ $tbound1 $(+ $tbound2)*)*, - $($typaram: $bound1 $(+ $bound2)*,)* - { - type Value = $ty<T $(, $typaram)*>; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str("a sequence") - } - - #[inline] - fn visit_seq<A>(self, mut $access: A) -> Result<Self::Value, A::Error> - where - A: SeqAccess<'de>, - { - let mut values = $with_capacity; - - while let Some(value) = tri!($access.next_element()) { - $insert(&mut values, value); - } - - Ok(values) - } - } - - let visitor = SeqVisitor { marker: PhantomData }; - deserializer.deserialize_seq(visitor) - } - - fn deserialize_in_place<D>(deserializer: D, place: &mut Self) -> Result<(), D::Error> - where - D: Deserializer<'de>, - { - struct SeqInPlaceVisitor<'a, T: 'a $(, $typaram: 'a)*>(&'a mut $ty<T $(, $typaram)*>); - - impl<'a, 'de, T $(, $typaram)*> Visitor<'de> for SeqInPlaceVisitor<'a, T $(, $typaram)*> - where - T: Deserialize<'de> $(+ $tbound1 $(+ $tbound2)*)*, - $($typaram: $bound1 $(+ $bound2)*,)* - { - type Value = (); - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str("a sequence") - } - - #[inline] - fn visit_seq<A>(mut self, mut $access: A) -> Result<Self::Value, A::Error> - where - A: SeqAccess<'de>, - { - $clear(&mut self.0); - $reserve(&mut self.0, size_hint::cautious::<T>($access.size_hint())); - - // FIXME: try to overwrite old values here? (Vec, VecDeque, LinkedList) - while let Some(value) = tri!($access.next_element()) { - $insert(&mut self.0, value); - } - - Ok(()) - } - } - - deserializer.deserialize_seq(SeqInPlaceVisitor(place)) - } - } - } -} - -// Dummy impl of reserve -#[cfg(any(feature = "std", feature = "alloc"))] -fn nop_reserve<T>(_seq: T, _n: usize) {} - -seq_impl!( - #[cfg(any(feature = "std", feature = "alloc"))] - #[cfg_attr(doc_cfg, doc(cfg(any(feature = "std", feature = "alloc"))))] - BinaryHeap<T: Ord>, - seq, - BinaryHeap::clear, - BinaryHeap::with_capacity(size_hint::cautious::<T>(seq.size_hint())), - BinaryHeap::reserve, - BinaryHeap::push -); - -seq_impl!( - #[cfg(any(feature = "std", feature = "alloc"))] - #[cfg_attr(doc_cfg, doc(cfg(any(feature = "std", feature = "alloc"))))] - BTreeSet<T: Eq + Ord>, - seq, - BTreeSet::clear, - BTreeSet::new(), - nop_reserve, - BTreeSet::insert -); - -seq_impl!( - #[cfg(any(feature = "std", feature = "alloc"))] - #[cfg_attr(doc_cfg, doc(cfg(any(feature = "std", feature = "alloc"))))] - LinkedList<T>, - seq, - LinkedList::clear, - LinkedList::new(), - nop_reserve, - LinkedList::push_back -); - -seq_impl!( - #[cfg(feature = "std")] - #[cfg_attr(doc_cfg, doc(cfg(feature = "std")))] - HashSet<T: Eq + Hash, S: BuildHasher + Default>, - seq, - HashSet::clear, - HashSet::with_capacity_and_hasher(size_hint::cautious::<T>(seq.size_hint()), S::default()), - HashSet::reserve, - HashSet::insert -); - -seq_impl!( - #[cfg(any(feature = "std", feature = "alloc"))] - #[cfg_attr(doc_cfg, doc(cfg(any(feature = "std", feature = "alloc"))))] - VecDeque<T>, - seq, - VecDeque::clear, - VecDeque::with_capacity(size_hint::cautious::<T>(seq.size_hint())), - VecDeque::reserve, - VecDeque::push_back -); - -//////////////////////////////////////////////////////////////////////////////// - -#[cfg(any(feature = "std", feature = "alloc"))] -#[cfg_attr(doc_cfg, doc(cfg(any(feature = "std", feature = "alloc"))))] -impl<'de, T> Deserialize<'de> for Vec<T> -where - T: Deserialize<'de>, -{ - fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> - where - D: Deserializer<'de>, - { - struct VecVisitor<T> { - marker: PhantomData<T>, - } - - impl<'de, T> Visitor<'de> for VecVisitor<T> - where - T: Deserialize<'de>, - { - type Value = Vec<T>; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str("a sequence") - } - - fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error> - where - A: SeqAccess<'de>, - { - let capacity = size_hint::cautious::<T>(seq.size_hint()); - let mut values = Vec::<T>::with_capacity(capacity); - - while let Some(value) = tri!(seq.next_element()) { - values.push(value); - } - - Ok(values) - } - } - - let visitor = VecVisitor { - marker: PhantomData, - }; - deserializer.deserialize_seq(visitor) - } - - fn deserialize_in_place<D>(deserializer: D, place: &mut Self) -> Result<(), D::Error> - where - D: Deserializer<'de>, - { - struct VecInPlaceVisitor<'a, T: 'a>(&'a mut Vec<T>); - - impl<'a, 'de, T> Visitor<'de> for VecInPlaceVisitor<'a, T> - where - T: Deserialize<'de>, - { - type Value = (); - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str("a sequence") - } - - fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error> - where - A: SeqAccess<'de>, - { - let hint = size_hint::cautious::<T>(seq.size_hint()); - if let Some(additional) = hint.checked_sub(self.0.len()) { - self.0.reserve(additional); - } - - for i in 0..self.0.len() { - let next = { - let next_place = InPlaceSeed(&mut self.0[i]); - tri!(seq.next_element_seed(next_place)) - }; - if next.is_none() { - self.0.truncate(i); - return Ok(()); - } - } - - while let Some(value) = tri!(seq.next_element()) { - self.0.push(value); - } - - Ok(()) - } - } - - deserializer.deserialize_seq(VecInPlaceVisitor(place)) - } -} - -//////////////////////////////////////////////////////////////////////////////// - -struct ArrayVisitor<A> { - marker: PhantomData<A>, -} -struct ArrayInPlaceVisitor<'a, A: 'a>(&'a mut A); - -impl<A> ArrayVisitor<A> { - fn new() -> Self { - ArrayVisitor { - marker: PhantomData, - } - } -} - -impl<'de, T> Visitor<'de> for ArrayVisitor<[T; 0]> { - type Value = [T; 0]; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str("an empty array") - } - - #[inline] - fn visit_seq<A>(self, _: A) -> Result<Self::Value, A::Error> - where - A: SeqAccess<'de>, - { - Ok([]) - } -} - -// Does not require T: Deserialize<'de>. -impl<'de, T> Deserialize<'de> for [T; 0] { - fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> - where - D: Deserializer<'de>, - { - deserializer.deserialize_tuple(0, ArrayVisitor::<[T; 0]>::new()) - } -} - -macro_rules! array_impls { - ($($len:expr => ($($n:tt)+))+) => { - $( - impl<'de, T> Visitor<'de> for ArrayVisitor<[T; $len]> - where - T: Deserialize<'de>, - { - type Value = [T; $len]; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str(concat!("an array of length ", $len)) - } - - #[inline] - fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error> - where - A: SeqAccess<'de>, - { - Ok([$( - match tri!(seq.next_element()) { - Some(val) => val, - None => return Err(Error::invalid_length($n, &self)), - } - ),+]) - } - } - - impl<'a, 'de, T> Visitor<'de> for ArrayInPlaceVisitor<'a, [T; $len]> - where - T: Deserialize<'de>, - { - type Value = (); - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str(concat!("an array of length ", $len)) - } - - #[inline] - fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error> - where - A: SeqAccess<'de>, - { - let mut fail_idx = None; - for (idx, dest) in self.0[..].iter_mut().enumerate() { - if tri!(seq.next_element_seed(InPlaceSeed(dest))).is_none() { - fail_idx = Some(idx); - break; - } - } - if let Some(idx) = fail_idx { - return Err(Error::invalid_length(idx, &self)); - } - Ok(()) - } - } - - impl<'de, T> Deserialize<'de> for [T; $len] - where - T: Deserialize<'de>, - { - fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> - where - D: Deserializer<'de>, - { - deserializer.deserialize_tuple($len, ArrayVisitor::<[T; $len]>::new()) - } - - fn deserialize_in_place<D>(deserializer: D, place: &mut Self) -> Result<(), D::Error> - where - D: Deserializer<'de>, - { - deserializer.deserialize_tuple($len, ArrayInPlaceVisitor(place)) - } - } - )+ - } -} - -array_impls! { - 1 => (0) - 2 => (0 1) - 3 => (0 1 2) - 4 => (0 1 2 3) - 5 => (0 1 2 3 4) - 6 => (0 1 2 3 4 5) - 7 => (0 1 2 3 4 5 6) - 8 => (0 1 2 3 4 5 6 7) - 9 => (0 1 2 3 4 5 6 7 8) - 10 => (0 1 2 3 4 5 6 7 8 9) - 11 => (0 1 2 3 4 5 6 7 8 9 10) - 12 => (0 1 2 3 4 5 6 7 8 9 10 11) - 13 => (0 1 2 3 4 5 6 7 8 9 10 11 12) - 14 => (0 1 2 3 4 5 6 7 8 9 10 11 12 13) - 15 => (0 1 2 3 4 5 6 7 8 9 10 11 12 13 14) - 16 => (0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15) - 17 => (0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16) - 18 => (0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17) - 19 => (0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18) - 20 => (0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19) - 21 => (0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20) - 22 => (0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21) - 23 => (0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22) - 24 => (0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23) - 25 => (0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24) - 26 => (0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25) - 27 => (0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26) - 28 => (0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27) - 29 => (0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28) - 30 => (0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29) - 31 => (0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30) - 32 => (0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31) -} - -//////////////////////////////////////////////////////////////////////////////// - -macro_rules! tuple_impls { - ($($len:tt => ($($n:tt $name:ident)+))+) => { - $( - impl<'de, $($name: Deserialize<'de>),+> Deserialize<'de> for ($($name,)+) { - #[inline] - fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> - where - D: Deserializer<'de>, - { - struct TupleVisitor<$($name,)+> { - marker: PhantomData<($($name,)+)>, - } - - impl<'de, $($name: Deserialize<'de>),+> Visitor<'de> for TupleVisitor<$($name,)+> { - type Value = ($($name,)+); - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str(concat!("a tuple of size ", $len)) - } - - #[inline] - #[allow(non_snake_case)] - fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error> - where - A: SeqAccess<'de>, - { - $( - let $name = match tri!(seq.next_element()) { - Some(value) => value, - None => return Err(Error::invalid_length($n, &self)), - }; - )+ - - Ok(($($name,)+)) - } - } - - deserializer.deserialize_tuple($len, TupleVisitor { marker: PhantomData }) - } - - #[inline] - fn deserialize_in_place<D>(deserializer: D, place: &mut Self) -> Result<(), D::Error> - where - D: Deserializer<'de>, - { - struct TupleInPlaceVisitor<'a, $($name: 'a,)+>(&'a mut ($($name,)+)); - - impl<'a, 'de, $($name: Deserialize<'de>),+> Visitor<'de> for TupleInPlaceVisitor<'a, $($name,)+> { - type Value = (); - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str(concat!("a tuple of size ", $len)) - } - - #[inline] - #[allow(non_snake_case)] - fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error> - where - A: SeqAccess<'de>, - { - $( - if tri!(seq.next_element_seed(InPlaceSeed(&mut (self.0).$n))).is_none() { - return Err(Error::invalid_length($n, &self)); - } - )+ - - Ok(()) - } - } - - deserializer.deserialize_tuple($len, TupleInPlaceVisitor(place)) - } - } - )+ - } -} - -tuple_impls! { - 1 => (0 T0) - 2 => (0 T0 1 T1) - 3 => (0 T0 1 T1 2 T2) - 4 => (0 T0 1 T1 2 T2 3 T3) - 5 => (0 T0 1 T1 2 T2 3 T3 4 T4) - 6 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5) - 7 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6) - 8 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7) - 9 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8) - 10 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9) - 11 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10) - 12 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11) - 13 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12) - 14 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13) - 15 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14) - 16 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 15 T15) -} - -//////////////////////////////////////////////////////////////////////////////// - -macro_rules! map_impl { - ( - $(#[$attr:meta])* - $ty:ident <K $(: $kbound1:ident $(+ $kbound2:ident)*)*, V $(, $typaram:ident : $bound1:ident $(+ $bound2:ident)*)*>, - $access:ident, - $with_capacity:expr, - ) => { - $(#[$attr])* - impl<'de, K, V $(, $typaram)*> Deserialize<'de> for $ty<K, V $(, $typaram)*> - where - K: Deserialize<'de> $(+ $kbound1 $(+ $kbound2)*)*, - V: Deserialize<'de>, - $($typaram: $bound1 $(+ $bound2)*),* - { - fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> - where - D: Deserializer<'de>, - { - struct MapVisitor<K, V $(, $typaram)*> { - marker: PhantomData<$ty<K, V $(, $typaram)*>>, - } - - impl<'de, K, V $(, $typaram)*> Visitor<'de> for MapVisitor<K, V $(, $typaram)*> - where - K: Deserialize<'de> $(+ $kbound1 $(+ $kbound2)*)*, - V: Deserialize<'de>, - $($typaram: $bound1 $(+ $bound2)*),* - { - type Value = $ty<K, V $(, $typaram)*>; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str("a map") - } - - #[inline] - fn visit_map<A>(self, mut $access: A) -> Result<Self::Value, A::Error> - where - A: MapAccess<'de>, - { - let mut values = $with_capacity; - - while let Some((key, value)) = tri!($access.next_entry()) { - values.insert(key, value); - } - - Ok(values) - } - } - - let visitor = MapVisitor { marker: PhantomData }; - deserializer.deserialize_map(visitor) - } - } - } -} - -map_impl! { - #[cfg(any(feature = "std", feature = "alloc"))] - #[cfg_attr(doc_cfg, doc(cfg(any(feature = "std", feature = "alloc"))))] - BTreeMap<K: Ord, V>, - map, - BTreeMap::new(), -} - -map_impl! { - #[cfg(feature = "std")] - #[cfg_attr(doc_cfg, doc(cfg(feature = "std")))] - HashMap<K: Eq + Hash, V, S: BuildHasher + Default>, - map, - HashMap::with_capacity_and_hasher(size_hint::cautious::<(K, V)>(map.size_hint()), S::default()), -} - -//////////////////////////////////////////////////////////////////////////////// - -macro_rules! parse_ip_impl { - ( - $(#[$attr:meta])* - $ty:ty, $expecting:expr, $size:tt - ) => { - $(#[$attr])* - impl<'de> Deserialize<'de> for $ty { - fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> - where - D: Deserializer<'de>, - { - if deserializer.is_human_readable() { - deserializer.deserialize_str(FromStrVisitor::new($expecting)) - } else { - <[u8; $size]>::deserialize(deserializer).map(<$ty>::from) - } - } - } - }; -} - -#[cfg(feature = "std")] -macro_rules! variant_identifier { - ( - $name_kind:ident ($($variant:ident; $bytes:expr; $index:expr),*) - $expecting_message:expr, - $variants_name:ident - ) => { - enum $name_kind { - $($variant),* - } - - static $variants_name: &[&str] = &[$(stringify!($variant)),*]; - - impl<'de> Deserialize<'de> for $name_kind { - fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> - where - D: Deserializer<'de>, - { - struct KindVisitor; - - impl<'de> Visitor<'de> for KindVisitor { - type Value = $name_kind; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str($expecting_message) - } - - fn visit_u64<E>(self, value: u64) -> Result<Self::Value, E> - where - E: Error, - { - match value { - $( - $index => Ok($name_kind :: $variant), - )* - _ => Err(Error::invalid_value(Unexpected::Unsigned(value), &self),), - } - } - - fn visit_str<E>(self, value: &str) -> Result<Self::Value, E> - where - E: Error, - { - match value { - $( - stringify!($variant) => Ok($name_kind :: $variant), - )* - _ => Err(Error::unknown_variant(value, $variants_name)), - } - } - - fn visit_bytes<E>(self, value: &[u8]) -> Result<Self::Value, E> - where - E: Error, - { - match value { - $( - $bytes => Ok($name_kind :: $variant), - )* - _ => { - match str::from_utf8(value) { - Ok(value) => Err(Error::unknown_variant(value, $variants_name)), - Err(_) => Err(Error::invalid_value(Unexpected::Bytes(value), &self)), - } - } - } - } - } - - deserializer.deserialize_identifier(KindVisitor) - } - } - } -} - -#[cfg(feature = "std")] -macro_rules! deserialize_enum { - ( - $name:ident $name_kind:ident ($($variant:ident; $bytes:expr; $index:expr),*) - $expecting_message:expr, - $deserializer:expr - ) => { - variant_identifier! { - $name_kind ($($variant; $bytes; $index),*) - $expecting_message, - VARIANTS - } - - struct EnumVisitor; - impl<'de> Visitor<'de> for EnumVisitor { - type Value = $name; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str(concat!("a ", stringify!($name))) - } - - - fn visit_enum<A>(self, data: A) -> Result<Self::Value, A::Error> - where - A: EnumAccess<'de>, - { - match tri!(data.variant()) { - $( - ($name_kind :: $variant, v) => v.newtype_variant().map($name :: $variant), - )* - } - } - } - $deserializer.deserialize_enum(stringify!($name), VARIANTS, EnumVisitor) - } -} - -#[cfg(feature = "std")] -#[cfg_attr(doc_cfg, doc(cfg(feature = "std")))] -impl<'de> Deserialize<'de> for net::IpAddr { - fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> - where - D: Deserializer<'de>, - { - if deserializer.is_human_readable() { - deserializer.deserialize_str(FromStrVisitor::new("IP address")) - } else { - use crate::lib::net::IpAddr; - deserialize_enum! { - IpAddr IpAddrKind (V4; b"V4"; 0, V6; b"V6"; 1) - "`V4` or `V6`", - deserializer - } - } - } -} - -parse_ip_impl! { - #[cfg(feature = "std")] - #[cfg_attr(doc_cfg, doc(cfg(feature = "std")))] - net::Ipv4Addr, "IPv4 address", 4 -} - -parse_ip_impl! { - #[cfg(feature = "std")] - #[cfg_attr(doc_cfg, doc(cfg(feature = "std")))] - net::Ipv6Addr, "IPv6 address", 16 -} - -macro_rules! parse_socket_impl { - ( - $(#[$attr:meta])* - $ty:ty, $expecting:tt, - $new:expr, - ) => { - $(#[$attr])* - impl<'de> Deserialize<'de> for $ty { - fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> - where - D: Deserializer<'de>, - { - if deserializer.is_human_readable() { - deserializer.deserialize_str(FromStrVisitor::new($expecting)) - } else { - <(_, u16)>::deserialize(deserializer).map($new) - } - } - } - }; -} - -#[cfg(feature = "std")] -#[cfg_attr(doc_cfg, doc(cfg(feature = "std")))] -impl<'de> Deserialize<'de> for net::SocketAddr { - fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> - where - D: Deserializer<'de>, - { - if deserializer.is_human_readable() { - deserializer.deserialize_str(FromStrVisitor::new("socket address")) - } else { - use crate::lib::net::SocketAddr; - deserialize_enum! { - SocketAddr SocketAddrKind (V4; b"V4"; 0, V6; b"V6"; 1) - "`V4` or `V6`", - deserializer - } - } - } -} - -parse_socket_impl! { - #[cfg(feature = "std")] - #[cfg_attr(doc_cfg, doc(cfg(feature = "std")))] - net::SocketAddrV4, "IPv4 socket address", - |(ip, port)| net::SocketAddrV4::new(ip, port), -} - -parse_socket_impl! { - #[cfg(feature = "std")] - #[cfg_attr(doc_cfg, doc(cfg(feature = "std")))] - net::SocketAddrV6, "IPv6 socket address", - |(ip, port)| net::SocketAddrV6::new(ip, port, 0, 0), -} - -//////////////////////////////////////////////////////////////////////////////// - -#[cfg(feature = "std")] -struct PathVisitor; - -#[cfg(feature = "std")] -impl<'a> Visitor<'a> for PathVisitor { - type Value = &'a Path; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str("a borrowed path") - } - - fn visit_borrowed_str<E>(self, v: &'a str) -> Result<Self::Value, E> - where - E: Error, - { - Ok(v.as_ref()) - } - - fn visit_borrowed_bytes<E>(self, v: &'a [u8]) -> Result<Self::Value, E> - where - E: Error, - { - str::from_utf8(v) - .map(AsRef::as_ref) - .map_err(|_| Error::invalid_value(Unexpected::Bytes(v), &self)) - } -} - -#[cfg(feature = "std")] -#[cfg_attr(doc_cfg, doc(cfg(feature = "std")))] -impl<'de: 'a, 'a> Deserialize<'de> for &'a Path { - fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> - where - D: Deserializer<'de>, - { - deserializer.deserialize_str(PathVisitor) - } -} - -#[cfg(feature = "std")] -struct PathBufVisitor; - -#[cfg(feature = "std")] -impl<'de> Visitor<'de> for PathBufVisitor { - type Value = PathBuf; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str("path string") - } - - fn visit_str<E>(self, v: &str) -> Result<Self::Value, E> - where - E: Error, - { - Ok(From::from(v)) - } - - fn visit_string<E>(self, v: String) -> Result<Self::Value, E> - where - E: Error, - { - Ok(From::from(v)) - } - - fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E> - where - E: Error, - { - str::from_utf8(v) - .map(From::from) - .map_err(|_| Error::invalid_value(Unexpected::Bytes(v), &self)) - } - - fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E> - where - E: Error, - { - String::from_utf8(v) - .map(From::from) - .map_err(|e| Error::invalid_value(Unexpected::Bytes(&e.into_bytes()), &self)) - } -} - -#[cfg(feature = "std")] -#[cfg_attr(doc_cfg, doc(cfg(feature = "std")))] -impl<'de> Deserialize<'de> for PathBuf { - fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> - where - D: Deserializer<'de>, - { - deserializer.deserialize_string(PathBufVisitor) - } -} - -forwarded_impl! { - #[cfg(feature = "std")] - #[cfg_attr(doc_cfg, doc(cfg(feature = "std")))] - (), Box<Path>, PathBuf::into_boxed_path -} - -//////////////////////////////////////////////////////////////////////////////// - -// If this were outside of the serde crate, it would just use: -// -// #[derive(Deserialize)] -// #[serde(variant_identifier)] -#[cfg(all(feature = "std", any(unix, windows)))] -variant_identifier! { - OsStringKind (Unix; b"Unix"; 0, Windows; b"Windows"; 1) - "`Unix` or `Windows`", - OSSTR_VARIANTS -} - -#[cfg(all(feature = "std", any(unix, windows)))] -struct OsStringVisitor; - -#[cfg(all(feature = "std", any(unix, windows)))] -impl<'de> Visitor<'de> for OsStringVisitor { - type Value = OsString; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str("os string") - } - - #[cfg(unix)] - fn visit_enum<A>(self, data: A) -> Result<Self::Value, A::Error> - where - A: EnumAccess<'de>, - { - use std::os::unix::ffi::OsStringExt; - - match tri!(data.variant()) { - (OsStringKind::Unix, v) => v.newtype_variant().map(OsString::from_vec), - (OsStringKind::Windows, _) => Err(Error::custom( - "cannot deserialize Windows OS string on Unix", - )), - } - } - - #[cfg(windows)] - fn visit_enum<A>(self, data: A) -> Result<Self::Value, A::Error> - where - A: EnumAccess<'de>, - { - use std::os::windows::ffi::OsStringExt; - - match tri!(data.variant()) { - (OsStringKind::Windows, v) => v - .newtype_variant::<Vec<u16>>() - .map(|vec| OsString::from_wide(&vec)), - (OsStringKind::Unix, _) => Err(Error::custom( - "cannot deserialize Unix OS string on Windows", - )), - } - } -} - -#[cfg(all(feature = "std", any(unix, windows)))] -#[cfg_attr(doc_cfg, doc(cfg(all(feature = "std", any(unix, windows)))))] -impl<'de> Deserialize<'de> for OsString { - fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> - where - D: Deserializer<'de>, - { - deserializer.deserialize_enum("OsString", OSSTR_VARIANTS, OsStringVisitor) - } -} - -//////////////////////////////////////////////////////////////////////////////// - -forwarded_impl! { - #[cfg(any(feature = "std", feature = "alloc"))] - #[cfg_attr(doc_cfg, doc(cfg(any(feature = "std", feature = "alloc"))))] - (T), Box<T>, Box::new -} - -forwarded_impl! { - #[cfg(any(feature = "std", feature = "alloc"))] - #[cfg_attr(doc_cfg, doc(cfg(any(feature = "std", feature = "alloc"))))] - (T), Box<[T]>, Vec::into_boxed_slice -} - -forwarded_impl! { - #[cfg(any(feature = "std", feature = "alloc"))] - #[cfg_attr(doc_cfg, doc(cfg(any(feature = "std", feature = "alloc"))))] - (), Box<str>, String::into_boxed_str -} - -forwarded_impl! { - #[cfg(all(feature = "std", any(unix, windows)))] - #[cfg_attr(doc_cfg, doc(cfg(all(feature = "std", any(unix, windows)))))] - (), Box<OsStr>, OsString::into_boxed_os_str -} - -#[cfg(any(feature = "std", feature = "alloc"))] -#[cfg_attr(doc_cfg, doc(cfg(any(feature = "std", feature = "alloc"))))] -impl<'de, 'a, T: ?Sized> Deserialize<'de> for Cow<'a, T> -where - T: ToOwned, - T::Owned: Deserialize<'de>, -{ - #[inline] - fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> - where - D: Deserializer<'de>, - { - T::Owned::deserialize(deserializer).map(Cow::Owned) - } -} - -//////////////////////////////////////////////////////////////////////////////// - -/// This impl requires the [`"rc"`] Cargo feature of Serde. The resulting -/// `Weak<T>` has a reference count of 0 and cannot be upgraded. -/// -/// [`"rc"`]: https://serde.rs/feature-flags.html#-features-rc -#[cfg(all(feature = "rc", any(feature = "std", feature = "alloc")))] -#[cfg_attr( - doc_cfg, - doc(cfg(all(feature = "rc", any(feature = "std", feature = "alloc")))) -)] -impl<'de, T: ?Sized> Deserialize<'de> for RcWeak<T> -where - T: Deserialize<'de>, -{ - fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> - where - D: Deserializer<'de>, - { - tri!(Option::<T>::deserialize(deserializer)); - Ok(RcWeak::new()) - } -} - -/// This impl requires the [`"rc"`] Cargo feature of Serde. The resulting -/// `Weak<T>` has a reference count of 0 and cannot be upgraded. -/// -/// [`"rc"`]: https://serde.rs/feature-flags.html#-features-rc -#[cfg(all(feature = "rc", any(feature = "std", feature = "alloc")))] -#[cfg_attr( - doc_cfg, - doc(cfg(all(feature = "rc", any(feature = "std", feature = "alloc")))) -)] -impl<'de, T: ?Sized> Deserialize<'de> for ArcWeak<T> -where - T: Deserialize<'de>, -{ - fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> - where - D: Deserializer<'de>, - { - tri!(Option::<T>::deserialize(deserializer)); - Ok(ArcWeak::new()) - } -} - -//////////////////////////////////////////////////////////////////////////////// - -macro_rules! box_forwarded_impl { - ( - $(#[$attr:meta])* - $t:ident - ) => { - $(#[$attr])* - impl<'de, T: ?Sized> Deserialize<'de> for $t<T> - where - Box<T>: Deserialize<'de>, - { - fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> - where - D: Deserializer<'de>, - { - Box::deserialize(deserializer).map(Into::into) - } - } - }; -} - -box_forwarded_impl! { - /// This impl requires the [`"rc"`] Cargo feature of Serde. - /// - /// Deserializing a data structure containing `Rc` will not attempt to - /// deduplicate `Rc` references to the same data. Every deserialized `Rc` - /// will end up with a strong count of 1. - /// - /// [`"rc"`]: https://serde.rs/feature-flags.html#-features-rc - #[cfg(all(feature = "rc", any(feature = "std", feature = "alloc")))] - #[cfg_attr(doc_cfg, doc(cfg(all(feature = "rc", any(feature = "std", feature = "alloc")))))] - Rc -} - -box_forwarded_impl! { - /// This impl requires the [`"rc"`] Cargo feature of Serde. - /// - /// Deserializing a data structure containing `Arc` will not attempt to - /// deduplicate `Arc` references to the same data. Every deserialized `Arc` - /// will end up with a strong count of 1. - /// - /// [`"rc"`]: https://serde.rs/feature-flags.html#-features-rc - #[cfg(all(feature = "rc", any(feature = "std", feature = "alloc")))] - #[cfg_attr(doc_cfg, doc(cfg(all(feature = "rc", any(feature = "std", feature = "alloc")))))] - Arc -} - -//////////////////////////////////////////////////////////////////////////////// - -impl<'de, T> Deserialize<'de> for Cell<T> -where - T: Deserialize<'de> + Copy, -{ - fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> - where - D: Deserializer<'de>, - { - T::deserialize(deserializer).map(Cell::new) - } -} - -forwarded_impl! { - (T), RefCell<T>, RefCell::new -} - -forwarded_impl! { - #[cfg(feature = "std")] - #[cfg_attr(doc_cfg, doc(cfg(feature = "std")))] - (T), Mutex<T>, Mutex::new -} - -forwarded_impl! { - #[cfg(feature = "std")] - #[cfg_attr(doc_cfg, doc(cfg(feature = "std")))] - (T), RwLock<T>, RwLock::new -} - -//////////////////////////////////////////////////////////////////////////////// - -// This is a cleaned-up version of the impl generated by: -// -// #[derive(Deserialize)] -// #[serde(deny_unknown_fields)] -// struct Duration { -// secs: u64, -// nanos: u32, -// } -impl<'de> Deserialize<'de> for Duration { - fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> - where - D: Deserializer<'de>, - { - // If this were outside of the serde crate, it would just use: - // - // #[derive(Deserialize)] - // #[serde(field_identifier, rename_all = "lowercase")] - enum Field { - Secs, - Nanos, - } - - impl<'de> Deserialize<'de> for Field { - fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> - where - D: Deserializer<'de>, - { - struct FieldVisitor; - - impl<'de> Visitor<'de> for FieldVisitor { - type Value = Field; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str("`secs` or `nanos`") - } - - fn visit_str<E>(self, value: &str) -> Result<Self::Value, E> - where - E: Error, - { - match value { - "secs" => Ok(Field::Secs), - "nanos" => Ok(Field::Nanos), - _ => Err(Error::unknown_field(value, FIELDS)), - } - } - - fn visit_bytes<E>(self, value: &[u8]) -> Result<Self::Value, E> - where - E: Error, - { - match value { - b"secs" => Ok(Field::Secs), - b"nanos" => Ok(Field::Nanos), - _ => { - let value = crate::__private::from_utf8_lossy(value); - Err(Error::unknown_field(&*value, FIELDS)) - } - } - } - } - - deserializer.deserialize_identifier(FieldVisitor) - } - } - - fn check_overflow<E>(secs: u64, nanos: u32) -> Result<(), E> - where - E: Error, - { - static NANOS_PER_SEC: u32 = 1_000_000_000; - match secs.checked_add((nanos / NANOS_PER_SEC) as u64) { - Some(_) => Ok(()), - None => Err(E::custom("overflow deserializing Duration")), - } - } - - struct DurationVisitor; - - impl<'de> Visitor<'de> for DurationVisitor { - type Value = Duration; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str("struct Duration") - } - - fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error> - where - A: SeqAccess<'de>, - { - let secs: u64 = match tri!(seq.next_element()) { - Some(value) => value, - None => { - return Err(Error::invalid_length(0, &self)); - } - }; - let nanos: u32 = match tri!(seq.next_element()) { - Some(value) => value, - None => { - return Err(Error::invalid_length(1, &self)); - } - }; - tri!(check_overflow(secs, nanos)); - Ok(Duration::new(secs, nanos)) - } - - fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error> - where - A: MapAccess<'de>, - { - let mut secs: Option<u64> = None; - let mut nanos: Option<u32> = None; - while let Some(key) = tri!(map.next_key()) { - match key { - Field::Secs => { - if secs.is_some() { - return Err(<A::Error as Error>::duplicate_field("secs")); - } - secs = Some(tri!(map.next_value())); - } - Field::Nanos => { - if nanos.is_some() { - return Err(<A::Error as Error>::duplicate_field("nanos")); - } - nanos = Some(tri!(map.next_value())); - } - } - } - let secs = match secs { - Some(secs) => secs, - None => return Err(<A::Error as Error>::missing_field("secs")), - }; - let nanos = match nanos { - Some(nanos) => nanos, - None => return Err(<A::Error as Error>::missing_field("nanos")), - }; - tri!(check_overflow(secs, nanos)); - Ok(Duration::new(secs, nanos)) - } - } - - const FIELDS: &[&str] = &["secs", "nanos"]; - deserializer.deserialize_struct("Duration", FIELDS, DurationVisitor) - } -} - -//////////////////////////////////////////////////////////////////////////////// - -#[cfg(feature = "std")] -#[cfg_attr(doc_cfg, doc(cfg(feature = "std")))] -impl<'de> Deserialize<'de> for SystemTime { - fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> - where - D: Deserializer<'de>, - { - // Reuse duration - enum Field { - Secs, - Nanos, - } - - impl<'de> Deserialize<'de> for Field { - fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> - where - D: Deserializer<'de>, - { - struct FieldVisitor; - - impl<'de> Visitor<'de> for FieldVisitor { - type Value = Field; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str("`secs_since_epoch` or `nanos_since_epoch`") - } - - fn visit_str<E>(self, value: &str) -> Result<Self::Value, E> - where - E: Error, - { - match value { - "secs_since_epoch" => Ok(Field::Secs), - "nanos_since_epoch" => Ok(Field::Nanos), - _ => Err(Error::unknown_field(value, FIELDS)), - } - } - - fn visit_bytes<E>(self, value: &[u8]) -> Result<Self::Value, E> - where - E: Error, - { - match value { - b"secs_since_epoch" => Ok(Field::Secs), - b"nanos_since_epoch" => Ok(Field::Nanos), - _ => { - let value = String::from_utf8_lossy(value); - Err(Error::unknown_field(&value, FIELDS)) - } - } - } - } - - deserializer.deserialize_identifier(FieldVisitor) - } - } - - fn check_overflow<E>(secs: u64, nanos: u32) -> Result<(), E> - where - E: Error, - { - static NANOS_PER_SEC: u32 = 1_000_000_000; - match secs.checked_add((nanos / NANOS_PER_SEC) as u64) { - Some(_) => Ok(()), - None => Err(E::custom("overflow deserializing SystemTime epoch offset")), - } - } - - struct DurationVisitor; - - impl<'de> Visitor<'de> for DurationVisitor { - type Value = Duration; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str("struct SystemTime") - } - - fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error> - where - A: SeqAccess<'de>, - { - let secs: u64 = match tri!(seq.next_element()) { - Some(value) => value, - None => { - return Err(Error::invalid_length(0, &self)); - } - }; - let nanos: u32 = match tri!(seq.next_element()) { - Some(value) => value, - None => { - return Err(Error::invalid_length(1, &self)); - } - }; - tri!(check_overflow(secs, nanos)); - Ok(Duration::new(secs, nanos)) - } - - fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error> - where - A: MapAccess<'de>, - { - let mut secs: Option<u64> = None; - let mut nanos: Option<u32> = None; - while let Some(key) = tri!(map.next_key()) { - match key { - Field::Secs => { - if secs.is_some() { - return Err(<A::Error as Error>::duplicate_field( - "secs_since_epoch", - )); - } - secs = Some(tri!(map.next_value())); - } - Field::Nanos => { - if nanos.is_some() { - return Err(<A::Error as Error>::duplicate_field( - "nanos_since_epoch", - )); - } - nanos = Some(tri!(map.next_value())); - } - } - } - let secs = match secs { - Some(secs) => secs, - None => return Err(<A::Error as Error>::missing_field("secs_since_epoch")), - }; - let nanos = match nanos { - Some(nanos) => nanos, - None => return Err(<A::Error as Error>::missing_field("nanos_since_epoch")), - }; - tri!(check_overflow(secs, nanos)); - Ok(Duration::new(secs, nanos)) - } - } - - const FIELDS: &[&str] = &["secs_since_epoch", "nanos_since_epoch"]; - let duration = tri!(deserializer.deserialize_struct("SystemTime", FIELDS, DurationVisitor)); - #[cfg(not(no_systemtime_checked_add))] - let ret = UNIX_EPOCH - .checked_add(duration) - .ok_or_else(|| D::Error::custom("overflow deserializing SystemTime")); - #[cfg(no_systemtime_checked_add)] - let ret = Ok(UNIX_EPOCH + duration); - ret - } -} - -//////////////////////////////////////////////////////////////////////////////// - -// Similar to: -// -// #[derive(Deserialize)] -// #[serde(deny_unknown_fields)] -// struct Range<Idx> { -// start: Idx, -// end: Idx, -// } -impl<'de, Idx> Deserialize<'de> for Range<Idx> -where - Idx: Deserialize<'de>, -{ - fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> - where - D: Deserializer<'de>, - { - let (start, end) = tri!(deserializer.deserialize_struct( - "Range", - range::FIELDS, - range::RangeVisitor { - expecting: "struct Range", - phantom: PhantomData, - }, - )); - Ok(start..end) - } -} - -impl<'de, Idx> Deserialize<'de> for RangeInclusive<Idx> -where - Idx: Deserialize<'de>, -{ - fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> - where - D: Deserializer<'de>, - { - let (start, end) = tri!(deserializer.deserialize_struct( - "RangeInclusive", - range::FIELDS, - range::RangeVisitor { - expecting: "struct RangeInclusive", - phantom: PhantomData, - }, - )); - Ok(RangeInclusive::new(start, end)) - } -} - -mod range { - use crate::lib::*; - - use crate::de::{Deserialize, Deserializer, Error, MapAccess, SeqAccess, Visitor}; - - pub const FIELDS: &[&str] = &["start", "end"]; - - // If this were outside of the serde crate, it would just use: - // - // #[derive(Deserialize)] - // #[serde(field_identifier, rename_all = "lowercase")] - enum Field { - Start, - End, - } - - impl<'de> Deserialize<'de> for Field { - fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> - where - D: Deserializer<'de>, - { - struct FieldVisitor; - - impl<'de> Visitor<'de> for FieldVisitor { - type Value = Field; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str("`start` or `end`") - } - - fn visit_str<E>(self, value: &str) -> Result<Self::Value, E> - where - E: Error, - { - match value { - "start" => Ok(Field::Start), - "end" => Ok(Field::End), - _ => Err(Error::unknown_field(value, FIELDS)), - } - } - - fn visit_bytes<E>(self, value: &[u8]) -> Result<Self::Value, E> - where - E: Error, - { - match value { - b"start" => Ok(Field::Start), - b"end" => Ok(Field::End), - _ => { - let value = crate::__private::from_utf8_lossy(value); - Err(Error::unknown_field(&*value, FIELDS)) - } - } - } - } - - deserializer.deserialize_identifier(FieldVisitor) - } - } - - pub struct RangeVisitor<Idx> { - pub expecting: &'static str, - pub phantom: PhantomData<Idx>, - } - - impl<'de, Idx> Visitor<'de> for RangeVisitor<Idx> - where - Idx: Deserialize<'de>, - { - type Value = (Idx, Idx); - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str(self.expecting) - } - - fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error> - where - A: SeqAccess<'de>, - { - let start: Idx = match tri!(seq.next_element()) { - Some(value) => value, - None => { - return Err(Error::invalid_length(0, &self)); - } - }; - let end: Idx = match tri!(seq.next_element()) { - Some(value) => value, - None => { - return Err(Error::invalid_length(1, &self)); - } - }; - Ok((start, end)) - } - - fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error> - where - A: MapAccess<'de>, - { - let mut start: Option<Idx> = None; - let mut end: Option<Idx> = None; - while let Some(key) = tri!(map.next_key()) { - match key { - Field::Start => { - if start.is_some() { - return Err(<A::Error as Error>::duplicate_field("start")); - } - start = Some(tri!(map.next_value())); - } - Field::End => { - if end.is_some() { - return Err(<A::Error as Error>::duplicate_field("end")); - } - end = Some(tri!(map.next_value())); - } - } - } - let start = match start { - Some(start) => start, - None => return Err(<A::Error as Error>::missing_field("start")), - }; - let end = match end { - Some(end) => end, - None => return Err(<A::Error as Error>::missing_field("end")), - }; - Ok((start, end)) - } - } -} - -//////////////////////////////////////////////////////////////////////////////// - -// Similar to: -// -// #[derive(Deserialize)] -// #[serde(deny_unknown_fields)] -// struct RangeFrom<Idx> { -// start: Idx, -// } -impl<'de, Idx> Deserialize<'de> for RangeFrom<Idx> -where - Idx: Deserialize<'de>, -{ - fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> - where - D: Deserializer<'de>, - { - let start = tri!(deserializer.deserialize_struct( - "RangeFrom", - range_from::FIELDS, - range_from::RangeFromVisitor { - expecting: "struct RangeFrom", - phantom: PhantomData, - }, - )); - Ok(start..) - } -} - -mod range_from { - use crate::lib::*; - - use crate::de::{Deserialize, Deserializer, Error, MapAccess, SeqAccess, Visitor}; - - pub const FIELDS: &[&str] = &["start"]; - - // If this were outside of the serde crate, it would just use: - // - // #[derive(Deserialize)] - // #[serde(field_identifier, rename_all = "lowercase")] - enum Field { - Start, - } - - impl<'de> Deserialize<'de> for Field { - fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> - where - D: Deserializer<'de>, - { - struct FieldVisitor; - - impl<'de> Visitor<'de> for FieldVisitor { - type Value = Field; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str("`start`") - } - - fn visit_str<E>(self, value: &str) -> Result<Self::Value, E> - where - E: Error, - { - match value { - "start" => Ok(Field::Start), - _ => Err(Error::unknown_field(value, FIELDS)), - } - } - - fn visit_bytes<E>(self, value: &[u8]) -> Result<Self::Value, E> - where - E: Error, - { - match value { - b"start" => Ok(Field::Start), - _ => { - let value = crate::__private::from_utf8_lossy(value); - Err(Error::unknown_field(&*value, FIELDS)) - } - } - } - } - - deserializer.deserialize_identifier(FieldVisitor) - } - } - - pub struct RangeFromVisitor<Idx> { - pub expecting: &'static str, - pub phantom: PhantomData<Idx>, - } - - impl<'de, Idx> Visitor<'de> for RangeFromVisitor<Idx> - where - Idx: Deserialize<'de>, - { - type Value = Idx; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str(self.expecting) - } - - fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error> - where - A: SeqAccess<'de>, - { - let start: Idx = match tri!(seq.next_element()) { - Some(value) => value, - None => { - return Err(Error::invalid_length(0, &self)); - } - }; - Ok(start) - } - - fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error> - where - A: MapAccess<'de>, - { - let mut start: Option<Idx> = None; - while let Some(key) = tri!(map.next_key()) { - match key { - Field::Start => { - if start.is_some() { - return Err(<A::Error as Error>::duplicate_field("start")); - } - start = Some(tri!(map.next_value())); - } - } - } - let start = match start { - Some(start) => start, - None => return Err(<A::Error as Error>::missing_field("start")), - }; - Ok(start) - } - } -} - -//////////////////////////////////////////////////////////////////////////////// - -// Similar to: -// -// #[derive(Deserialize)] -// #[serde(deny_unknown_fields)] -// struct RangeTo<Idx> { -// end: Idx, -// } -impl<'de, Idx> Deserialize<'de> for RangeTo<Idx> -where - Idx: Deserialize<'de>, -{ - fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> - where - D: Deserializer<'de>, - { - let end = tri!(deserializer.deserialize_struct( - "RangeTo", - range_to::FIELDS, - range_to::RangeToVisitor { - expecting: "struct RangeTo", - phantom: PhantomData, - }, - )); - Ok(..end) - } -} - -mod range_to { - use crate::lib::*; - - use crate::de::{Deserialize, Deserializer, Error, MapAccess, SeqAccess, Visitor}; - - pub const FIELDS: &[&str] = &["end"]; - - // If this were outside of the serde crate, it would just use: - // - // #[derive(Deserialize)] - // #[serde(field_identifier, rename_all = "lowercase")] - enum Field { - End, - } - - impl<'de> Deserialize<'de> for Field { - fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> - where - D: Deserializer<'de>, - { - struct FieldVisitor; - - impl<'de> Visitor<'de> for FieldVisitor { - type Value = Field; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str("`end`") - } - - fn visit_str<E>(self, value: &str) -> Result<Self::Value, E> - where - E: Error, - { - match value { - "end" => Ok(Field::End), - _ => Err(Error::unknown_field(value, FIELDS)), - } - } - - fn visit_bytes<E>(self, value: &[u8]) -> Result<Self::Value, E> - where - E: Error, - { - match value { - b"end" => Ok(Field::End), - _ => { - let value = crate::__private::from_utf8_lossy(value); - Err(Error::unknown_field(&*value, FIELDS)) - } - } - } - } - - deserializer.deserialize_identifier(FieldVisitor) - } - } - - pub struct RangeToVisitor<Idx> { - pub expecting: &'static str, - pub phantom: PhantomData<Idx>, - } - - impl<'de, Idx> Visitor<'de> for RangeToVisitor<Idx> - where - Idx: Deserialize<'de>, - { - type Value = Idx; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str(self.expecting) - } - - fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error> - where - A: SeqAccess<'de>, - { - let end: Idx = match tri!(seq.next_element()) { - Some(value) => value, - None => { - return Err(Error::invalid_length(0, &self)); - } - }; - Ok(end) - } - - fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error> - where - A: MapAccess<'de>, - { - let mut end: Option<Idx> = None; - while let Some(key) = tri!(map.next_key()) { - match key { - Field::End => { - if end.is_some() { - return Err(<A::Error as Error>::duplicate_field("end")); - } - end = Some(tri!(map.next_value())); - } - } - } - let end = match end { - Some(end) => end, - None => return Err(<A::Error as Error>::missing_field("end")), - }; - Ok(end) - } - } -} - -//////////////////////////////////////////////////////////////////////////////// - -impl<'de, T> Deserialize<'de> for Bound<T> -where - T: Deserialize<'de>, -{ - fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> - where - D: Deserializer<'de>, - { - enum Field { - Unbounded, - Included, - Excluded, - } - - impl<'de> Deserialize<'de> for Field { - #[inline] - fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> - where - D: Deserializer<'de>, - { - struct FieldVisitor; - - impl<'de> Visitor<'de> for FieldVisitor { - type Value = Field; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str("`Unbounded`, `Included` or `Excluded`") - } - - fn visit_u64<E>(self, value: u64) -> Result<Self::Value, E> - where - E: Error, - { - match value { - 0 => Ok(Field::Unbounded), - 1 => Ok(Field::Included), - 2 => Ok(Field::Excluded), - _ => Err(Error::invalid_value(Unexpected::Unsigned(value), &self)), - } - } - - fn visit_str<E>(self, value: &str) -> Result<Self::Value, E> - where - E: Error, - { - match value { - "Unbounded" => Ok(Field::Unbounded), - "Included" => Ok(Field::Included), - "Excluded" => Ok(Field::Excluded), - _ => Err(Error::unknown_variant(value, VARIANTS)), - } - } - - fn visit_bytes<E>(self, value: &[u8]) -> Result<Self::Value, E> - where - E: Error, - { - match value { - b"Unbounded" => Ok(Field::Unbounded), - b"Included" => Ok(Field::Included), - b"Excluded" => Ok(Field::Excluded), - _ => match str::from_utf8(value) { - Ok(value) => Err(Error::unknown_variant(value, VARIANTS)), - Err(_) => { - Err(Error::invalid_value(Unexpected::Bytes(value), &self)) - } - }, - } - } - } - - deserializer.deserialize_identifier(FieldVisitor) - } - } - - struct BoundVisitor<T>(PhantomData<Bound<T>>); - - impl<'de, T> Visitor<'de> for BoundVisitor<T> - where - T: Deserialize<'de>, - { - type Value = Bound<T>; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str("enum Bound") - } - - fn visit_enum<A>(self, data: A) -> Result<Self::Value, A::Error> - where - A: EnumAccess<'de>, - { - match tri!(data.variant()) { - (Field::Unbounded, v) => v.unit_variant().map(|()| Bound::Unbounded), - (Field::Included, v) => v.newtype_variant().map(Bound::Included), - (Field::Excluded, v) => v.newtype_variant().map(Bound::Excluded), - } - } - } - - const VARIANTS: &[&str] = &["Unbounded", "Included", "Excluded"]; - - deserializer.deserialize_enum("Bound", VARIANTS, BoundVisitor(PhantomData)) - } -} - -//////////////////////////////////////////////////////////////////////////////// - -impl<'de, T, E> Deserialize<'de> for Result<T, E> -where - T: Deserialize<'de>, - E: Deserialize<'de>, -{ - fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> - where - D: Deserializer<'de>, - { - // If this were outside of the serde crate, it would just use: - // - // #[derive(Deserialize)] - // #[serde(variant_identifier)] - enum Field { - Ok, - Err, - } - - impl<'de> Deserialize<'de> for Field { - #[inline] - fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> - where - D: Deserializer<'de>, - { - struct FieldVisitor; - - impl<'de> Visitor<'de> for FieldVisitor { - type Value = Field; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str("`Ok` or `Err`") - } - - fn visit_u64<E>(self, value: u64) -> Result<Self::Value, E> - where - E: Error, - { - match value { - 0 => Ok(Field::Ok), - 1 => Ok(Field::Err), - _ => Err(Error::invalid_value(Unexpected::Unsigned(value), &self)), - } - } - - fn visit_str<E>(self, value: &str) -> Result<Self::Value, E> - where - E: Error, - { - match value { - "Ok" => Ok(Field::Ok), - "Err" => Ok(Field::Err), - _ => Err(Error::unknown_variant(value, VARIANTS)), - } - } - - fn visit_bytes<E>(self, value: &[u8]) -> Result<Self::Value, E> - where - E: Error, - { - match value { - b"Ok" => Ok(Field::Ok), - b"Err" => Ok(Field::Err), - _ => match str::from_utf8(value) { - Ok(value) => Err(Error::unknown_variant(value, VARIANTS)), - Err(_) => { - Err(Error::invalid_value(Unexpected::Bytes(value), &self)) - } - }, - } - } - } - - deserializer.deserialize_identifier(FieldVisitor) - } - } - - struct ResultVisitor<T, E>(PhantomData<Result<T, E>>); - - impl<'de, T, E> Visitor<'de> for ResultVisitor<T, E> - where - T: Deserialize<'de>, - E: Deserialize<'de>, - { - type Value = Result<T, E>; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str("enum Result") - } - - fn visit_enum<A>(self, data: A) -> Result<Self::Value, A::Error> - where - A: EnumAccess<'de>, - { - match tri!(data.variant()) { - (Field::Ok, v) => v.newtype_variant().map(Ok), - (Field::Err, v) => v.newtype_variant().map(Err), - } - } - } - - const VARIANTS: &[&str] = &["Ok", "Err"]; - - deserializer.deserialize_enum("Result", VARIANTS, ResultVisitor(PhantomData)) - } -} - -//////////////////////////////////////////////////////////////////////////////// - -impl<'de, T> Deserialize<'de> for Wrapping<T> -where - T: Deserialize<'de>, -{ - fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> - where - D: Deserializer<'de>, - { - Deserialize::deserialize(deserializer).map(Wrapping) - } -} - -#[cfg(all(feature = "std", not(no_std_atomic)))] -macro_rules! atomic_impl { - ($($ty:ident $size:expr)*) => { - $( - #[cfg(any(no_target_has_atomic, target_has_atomic = $size))] - #[cfg_attr(doc_cfg, doc(cfg(all(feature = "std", target_has_atomic = $size))))] - impl<'de> Deserialize<'de> for $ty { - fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> - where - D: Deserializer<'de>, - { - Deserialize::deserialize(deserializer).map(Self::new) - } - } - )* - }; -} - -#[cfg(all(feature = "std", not(no_std_atomic)))] -atomic_impl! { - AtomicBool "8" - AtomicI8 "8" - AtomicI16 "16" - AtomicI32 "32" - AtomicIsize "ptr" - AtomicU8 "8" - AtomicU16 "16" - AtomicU32 "32" - AtomicUsize "ptr" -} - -#[cfg(all(feature = "std", not(no_std_atomic64)))] -atomic_impl! { - AtomicI64 "64" - AtomicU64 "64" -} - -#[cfg(feature = "std")] -struct FromStrVisitor<T> { - expecting: &'static str, - ty: PhantomData<T>, -} - -#[cfg(feature = "std")] -impl<T> FromStrVisitor<T> { - fn new(expecting: &'static str) -> Self { - FromStrVisitor { - expecting, - ty: PhantomData, - } - } -} - -#[cfg(feature = "std")] -impl<'de, T> Visitor<'de> for FromStrVisitor<T> -where - T: str::FromStr, - T::Err: fmt::Display, -{ - type Value = T; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str(self.expecting) - } - - fn visit_str<E>(self, s: &str) -> Result<Self::Value, E> - where - E: Error, - { - s.parse().map_err(Error::custom) - } -} |