diff options
author | Valentin Popov <valentin@popov.link> | 2024-07-19 15:37:58 +0300 |
---|---|---|
committer | Valentin Popov <valentin@popov.link> | 2024-07-19 15:37:58 +0300 |
commit | a990de90fe41456a23e58bd087d2f107d321f3a1 (patch) | |
tree | 15afc392522a9e85dc3332235e311b7d39352ea9 /vendor/serde/src/private | |
parent | 3d48cd3f81164bbfc1a755dc1d4a9a02f98c8ddd (diff) | |
download | fparkan-a990de90fe41456a23e58bd087d2f107d321f3a1.tar.xz fparkan-a990de90fe41456a23e58bd087d2f107d321f3a1.zip |
Deleted vendor folder
Diffstat (limited to 'vendor/serde/src/private')
-rw-r--r-- | vendor/serde/src/private/de.rs | 2892 | ||||
-rw-r--r-- | vendor/serde/src/private/doc.rs | 159 | ||||
-rw-r--r-- | vendor/serde/src/private/mod.rs | 48 | ||||
-rw-r--r-- | vendor/serde/src/private/ser.rs | 1385 |
4 files changed, 0 insertions, 4484 deletions
diff --git a/vendor/serde/src/private/de.rs b/vendor/serde/src/private/de.rs deleted file mode 100644 index 883e690..0000000 --- a/vendor/serde/src/private/de.rs +++ /dev/null @@ -1,2892 +0,0 @@ -use crate::lib::*; - -use crate::de::value::{BorrowedBytesDeserializer, BytesDeserializer}; -use crate::de::{ - Deserialize, DeserializeSeed, Deserializer, EnumAccess, Error, IntoDeserializer, VariantAccess, - Visitor, -}; - -#[cfg(any(feature = "std", feature = "alloc"))] -use crate::de::{MapAccess, Unexpected}; - -#[cfg(any(feature = "std", feature = "alloc"))] -pub use self::content::{ - Content, ContentDeserializer, ContentRefDeserializer, EnumDeserializer, - InternallyTaggedUnitVisitor, TagContentOtherField, TagContentOtherFieldVisitor, - TagOrContentField, TagOrContentFieldVisitor, TaggedContentVisitor, UntaggedUnitVisitor, -}; - -pub use crate::seed::InPlaceSeed; - -/// If the missing field is of type `Option<T>` then treat is as `None`, -/// otherwise it is an error. -pub fn missing_field<'de, V, E>(field: &'static str) -> Result<V, E> -where - V: Deserialize<'de>, - E: Error, -{ - struct MissingFieldDeserializer<E>(&'static str, PhantomData<E>); - - impl<'de, E> Deserializer<'de> for MissingFieldDeserializer<E> - where - E: Error, - { - type Error = E; - - fn deserialize_any<V>(self, _visitor: V) -> Result<V::Value, E> - where - V: Visitor<'de>, - { - Err(Error::missing_field(self.0)) - } - - fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, E> - where - V: Visitor<'de>, - { - visitor.visit_none() - } - - 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 - } - } - - let deserializer = MissingFieldDeserializer(field, PhantomData); - Deserialize::deserialize(deserializer) -} - -#[cfg(any(feature = "std", feature = "alloc"))] -pub fn borrow_cow_str<'de: 'a, 'a, D, R>(deserializer: D) -> Result<R, D::Error> -where - D: Deserializer<'de>, - R: From<Cow<'a, str>>, -{ - struct CowStrVisitor; - - impl<'a> Visitor<'a> for CowStrVisitor { - type Value = Cow<'a, str>; - - 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(Cow::Owned(v.to_owned())) - } - - fn visit_borrowed_str<E>(self, v: &'a str) -> Result<Self::Value, E> - where - E: Error, - { - Ok(Cow::Borrowed(v)) - } - - fn visit_string<E>(self, v: String) -> Result<Self::Value, E> - where - E: Error, - { - Ok(Cow::Owned(v)) - } - - fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E> - where - E: Error, - { - match str::from_utf8(v) { - Ok(s) => Ok(Cow::Owned(s.to_owned())), - Err(_) => Err(Error::invalid_value(Unexpected::Bytes(v), &self)), - } - } - - fn visit_borrowed_bytes<E>(self, v: &'a [u8]) -> Result<Self::Value, E> - where - E: Error, - { - match str::from_utf8(v) { - Ok(s) => Ok(Cow::Borrowed(s)), - 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(Cow::Owned(s)), - Err(e) => Err(Error::invalid_value( - Unexpected::Bytes(&e.into_bytes()), - &self, - )), - } - } - } - - deserializer.deserialize_str(CowStrVisitor).map(From::from) -} - -#[cfg(any(feature = "std", feature = "alloc"))] -pub fn borrow_cow_bytes<'de: 'a, 'a, D, R>(deserializer: D) -> Result<R, D::Error> -where - D: Deserializer<'de>, - R: From<Cow<'a, [u8]>>, -{ - struct CowBytesVisitor; - - impl<'a> Visitor<'a> for CowBytesVisitor { - type Value = Cow<'a, [u8]>; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str("a byte array") - } - - fn visit_str<E>(self, v: &str) -> Result<Self::Value, E> - where - E: Error, - { - Ok(Cow::Owned(v.as_bytes().to_vec())) - } - - fn visit_borrowed_str<E>(self, v: &'a str) -> Result<Self::Value, E> - where - E: Error, - { - Ok(Cow::Borrowed(v.as_bytes())) - } - - fn visit_string<E>(self, v: String) -> Result<Self::Value, E> - where - E: Error, - { - Ok(Cow::Owned(v.into_bytes())) - } - - fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E> - where - E: Error, - { - Ok(Cow::Owned(v.to_vec())) - } - - fn visit_borrowed_bytes<E>(self, v: &'a [u8]) -> Result<Self::Value, E> - where - E: Error, - { - Ok(Cow::Borrowed(v)) - } - - fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E> - where - E: Error, - { - Ok(Cow::Owned(v)) - } - } - - deserializer - .deserialize_bytes(CowBytesVisitor) - .map(From::from) -} - -#[cfg(any(feature = "std", feature = "alloc"))] -mod content { - // This module is private and nothing here should be used outside of - // generated code. - // - // We will iterate on the implementation for a few releases and only have to - // worry about backward compatibility for the `untagged` and `tag` attributes - // rather than for this entire mechanism. - // - // This issue is tracking making some of this stuff public: - // https://github.com/serde-rs/serde/issues/741 - - use crate::lib::*; - - use crate::actually_private; - use crate::de::value::{MapDeserializer, SeqDeserializer}; - use crate::de::{ - self, size_hint, Deserialize, DeserializeSeed, Deserializer, EnumAccess, Expected, - IgnoredAny, MapAccess, SeqAccess, Unexpected, Visitor, - }; - - /// Used from generated code to buffer the contents of the Deserializer when - /// deserializing untagged enums and internally tagged enums. - /// - /// Not public API. Use serde-value instead. - #[derive(Debug, Clone)] - pub enum Content<'de> { - Bool(bool), - - U8(u8), - U16(u16), - U32(u32), - U64(u64), - - I8(i8), - I16(i16), - I32(i32), - I64(i64), - - F32(f32), - F64(f64), - - Char(char), - String(String), - Str(&'de str), - ByteBuf(Vec<u8>), - Bytes(&'de [u8]), - - None, - Some(Box<Content<'de>>), - - Unit, - Newtype(Box<Content<'de>>), - Seq(Vec<Content<'de>>), - Map(Vec<(Content<'de>, Content<'de>)>), - } - - impl<'de> Content<'de> { - pub fn as_str(&self) -> Option<&str> { - match *self { - Content::Str(x) => Some(x), - Content::String(ref x) => Some(x), - Content::Bytes(x) => str::from_utf8(x).ok(), - Content::ByteBuf(ref x) => str::from_utf8(x).ok(), - _ => None, - } - } - - #[cold] - fn unexpected(&self) -> Unexpected { - match *self { - Content::Bool(b) => Unexpected::Bool(b), - Content::U8(n) => Unexpected::Unsigned(n as u64), - Content::U16(n) => Unexpected::Unsigned(n as u64), - Content::U32(n) => Unexpected::Unsigned(n as u64), - Content::U64(n) => Unexpected::Unsigned(n), - Content::I8(n) => Unexpected::Signed(n as i64), - Content::I16(n) => Unexpected::Signed(n as i64), - Content::I32(n) => Unexpected::Signed(n as i64), - Content::I64(n) => Unexpected::Signed(n), - Content::F32(f) => Unexpected::Float(f as f64), - Content::F64(f) => Unexpected::Float(f), - Content::Char(c) => Unexpected::Char(c), - Content::String(ref s) => Unexpected::Str(s), - Content::Str(s) => Unexpected::Str(s), - Content::ByteBuf(ref b) => Unexpected::Bytes(b), - Content::Bytes(b) => Unexpected::Bytes(b), - Content::None | Content::Some(_) => Unexpected::Option, - Content::Unit => Unexpected::Unit, - Content::Newtype(_) => Unexpected::NewtypeStruct, - Content::Seq(_) => Unexpected::Seq, - Content::Map(_) => Unexpected::Map, - } - } - } - - impl<'de> Deserialize<'de> for Content<'de> { - fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> - where - D: Deserializer<'de>, - { - // Untagged and internally tagged enums are only supported in - // self-describing formats. - let visitor = ContentVisitor { value: PhantomData }; - deserializer.__deserialize_content(actually_private::T, visitor) - } - } - - impl<'de, E> de::IntoDeserializer<'de, E> for Content<'de> - where - E: de::Error, - { - type Deserializer = ContentDeserializer<'de, E>; - - fn into_deserializer(self) -> Self::Deserializer { - ContentDeserializer::new(self) - } - } - - struct ContentVisitor<'de> { - value: PhantomData<Content<'de>>, - } - - impl<'de> ContentVisitor<'de> { - fn new() -> Self { - ContentVisitor { value: PhantomData } - } - } - - impl<'de> Visitor<'de> for ContentVisitor<'de> { - type Value = Content<'de>; - - fn expecting(&self, fmt: &mut fmt::Formatter) -> fmt::Result { - fmt.write_str("any value") - } - - fn visit_bool<F>(self, value: bool) -> Result<Self::Value, F> - where - F: de::Error, - { - Ok(Content::Bool(value)) - } - - fn visit_i8<F>(self, value: i8) -> Result<Self::Value, F> - where - F: de::Error, - { - Ok(Content::I8(value)) - } - - fn visit_i16<F>(self, value: i16) -> Result<Self::Value, F> - where - F: de::Error, - { - Ok(Content::I16(value)) - } - - fn visit_i32<F>(self, value: i32) -> Result<Self::Value, F> - where - F: de::Error, - { - Ok(Content::I32(value)) - } - - fn visit_i64<F>(self, value: i64) -> Result<Self::Value, F> - where - F: de::Error, - { - Ok(Content::I64(value)) - } - - fn visit_u8<F>(self, value: u8) -> Result<Self::Value, F> - where - F: de::Error, - { - Ok(Content::U8(value)) - } - - fn visit_u16<F>(self, value: u16) -> Result<Self::Value, F> - where - F: de::Error, - { - Ok(Content::U16(value)) - } - - fn visit_u32<F>(self, value: u32) -> Result<Self::Value, F> - where - F: de::Error, - { - Ok(Content::U32(value)) - } - - fn visit_u64<F>(self, value: u64) -> Result<Self::Value, F> - where - F: de::Error, - { - Ok(Content::U64(value)) - } - - fn visit_f32<F>(self, value: f32) -> Result<Self::Value, F> - where - F: de::Error, - { - Ok(Content::F32(value)) - } - - fn visit_f64<F>(self, value: f64) -> Result<Self::Value, F> - where - F: de::Error, - { - Ok(Content::F64(value)) - } - - fn visit_char<F>(self, value: char) -> Result<Self::Value, F> - where - F: de::Error, - { - Ok(Content::Char(value)) - } - - fn visit_str<F>(self, value: &str) -> Result<Self::Value, F> - where - F: de::Error, - { - Ok(Content::String(value.into())) - } - - fn visit_borrowed_str<F>(self, value: &'de str) -> Result<Self::Value, F> - where - F: de::Error, - { - Ok(Content::Str(value)) - } - - fn visit_string<F>(self, value: String) -> Result<Self::Value, F> - where - F: de::Error, - { - Ok(Content::String(value)) - } - - fn visit_bytes<F>(self, value: &[u8]) -> Result<Self::Value, F> - where - F: de::Error, - { - Ok(Content::ByteBuf(value.into())) - } - - fn visit_borrowed_bytes<F>(self, value: &'de [u8]) -> Result<Self::Value, F> - where - F: de::Error, - { - Ok(Content::Bytes(value)) - } - - fn visit_byte_buf<F>(self, value: Vec<u8>) -> Result<Self::Value, F> - where - F: de::Error, - { - Ok(Content::ByteBuf(value)) - } - - fn visit_unit<F>(self) -> Result<Self::Value, F> - where - F: de::Error, - { - Ok(Content::Unit) - } - - fn visit_none<F>(self) -> Result<Self::Value, F> - where - F: de::Error, - { - Ok(Content::None) - } - - fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error> - where - D: Deserializer<'de>, - { - Deserialize::deserialize(deserializer).map(|v| Content::Some(Box::new(v))) - } - - fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error> - where - D: Deserializer<'de>, - { - Deserialize::deserialize(deserializer).map(|v| Content::Newtype(Box::new(v))) - } - - fn visit_seq<V>(self, mut visitor: V) -> Result<Self::Value, V::Error> - where - V: SeqAccess<'de>, - { - let mut vec = - Vec::<Content>::with_capacity(size_hint::cautious::<Content>(visitor.size_hint())); - while let Some(e) = tri!(visitor.next_element()) { - vec.push(e); - } - Ok(Content::Seq(vec)) - } - - fn visit_map<V>(self, mut visitor: V) -> Result<Self::Value, V::Error> - where - V: MapAccess<'de>, - { - let mut vec = - Vec::<(Content, Content)>::with_capacity( - size_hint::cautious::<(Content, Content)>(visitor.size_hint()), - ); - while let Some(kv) = tri!(visitor.next_entry()) { - vec.push(kv); - } - Ok(Content::Map(vec)) - } - - fn visit_enum<V>(self, _visitor: V) -> Result<Self::Value, V::Error> - where - V: EnumAccess<'de>, - { - Err(de::Error::custom( - "untagged and internally tagged enums do not support enum input", - )) - } - } - - /// This is the type of the map keys in an internally tagged enum. - /// - /// Not public API. - pub enum TagOrContent<'de> { - Tag, - Content(Content<'de>), - } - - struct TagOrContentVisitor<'de> { - name: &'static str, - value: PhantomData<TagOrContent<'de>>, - } - - impl<'de> TagOrContentVisitor<'de> { - fn new(name: &'static str) -> Self { - TagOrContentVisitor { - name, - value: PhantomData, - } - } - } - - impl<'de> DeserializeSeed<'de> for TagOrContentVisitor<'de> { - type Value = TagOrContent<'de>; - - fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error> - where - D: Deserializer<'de>, - { - // Internally tagged enums are only supported in self-describing - // formats. - deserializer.deserialize_any(self) - } - } - - impl<'de> Visitor<'de> for TagOrContentVisitor<'de> { - type Value = TagOrContent<'de>; - - fn expecting(&self, fmt: &mut fmt::Formatter) -> fmt::Result { - write!(fmt, "a type tag `{}` or any other value", self.name) - } - - fn visit_bool<F>(self, value: bool) -> Result<Self::Value, F> - where - F: de::Error, - { - ContentVisitor::new() - .visit_bool(value) - .map(TagOrContent::Content) - } - - fn visit_i8<F>(self, value: i8) -> Result<Self::Value, F> - where - F: de::Error, - { - ContentVisitor::new() - .visit_i8(value) - .map(TagOrContent::Content) - } - - fn visit_i16<F>(self, value: i16) -> Result<Self::Value, F> - where - F: de::Error, - { - ContentVisitor::new() - .visit_i16(value) - .map(TagOrContent::Content) - } - - fn visit_i32<F>(self, value: i32) -> Result<Self::Value, F> - where - F: de::Error, - { - ContentVisitor::new() - .visit_i32(value) - .map(TagOrContent::Content) - } - - fn visit_i64<F>(self, value: i64) -> Result<Self::Value, F> - where - F: de::Error, - { - ContentVisitor::new() - .visit_i64(value) - .map(TagOrContent::Content) - } - - fn visit_u8<F>(self, value: u8) -> Result<Self::Value, F> - where - F: de::Error, - { - ContentVisitor::new() - .visit_u8(value) - .map(TagOrContent::Content) - } - - fn visit_u16<F>(self, value: u16) -> Result<Self::Value, F> - where - F: de::Error, - { - ContentVisitor::new() - .visit_u16(value) - .map(TagOrContent::Content) - } - - fn visit_u32<F>(self, value: u32) -> Result<Self::Value, F> - where - F: de::Error, - { - ContentVisitor::new() - .visit_u32(value) - .map(TagOrContent::Content) - } - - fn visit_u64<F>(self, value: u64) -> Result<Self::Value, F> - where - F: de::Error, - { - ContentVisitor::new() - .visit_u64(value) - .map(TagOrContent::Content) - } - - fn visit_f32<F>(self, value: f32) -> Result<Self::Value, F> - where - F: de::Error, - { - ContentVisitor::new() - .visit_f32(value) - .map(TagOrContent::Content) - } - - fn visit_f64<F>(self, value: f64) -> Result<Self::Value, F> - where - F: de::Error, - { - ContentVisitor::new() - .visit_f64(value) - .map(TagOrContent::Content) - } - - fn visit_char<F>(self, value: char) -> Result<Self::Value, F> - where - F: de::Error, - { - ContentVisitor::new() - .visit_char(value) - .map(TagOrContent::Content) - } - - fn visit_str<F>(self, value: &str) -> Result<Self::Value, F> - where - F: de::Error, - { - if value == self.name { - Ok(TagOrContent::Tag) - } else { - ContentVisitor::new() - .visit_str(value) - .map(TagOrContent::Content) - } - } - - fn visit_borrowed_str<F>(self, value: &'de str) -> Result<Self::Value, F> - where - F: de::Error, - { - if value == self.name { - Ok(TagOrContent::Tag) - } else { - ContentVisitor::new() - .visit_borrowed_str(value) - .map(TagOrContent::Content) - } - } - - fn visit_string<F>(self, value: String) -> Result<Self::Value, F> - where - F: de::Error, - { - if value == self.name { - Ok(TagOrContent::Tag) - } else { - ContentVisitor::new() - .visit_string(value) - .map(TagOrContent::Content) - } - } - - fn visit_bytes<F>(self, value: &[u8]) -> Result<Self::Value, F> - where - F: de::Error, - { - if value == self.name.as_bytes() { - Ok(TagOrContent::Tag) - } else { - ContentVisitor::new() - .visit_bytes(value) - .map(TagOrContent::Content) - } - } - - fn visit_borrowed_bytes<F>(self, value: &'de [u8]) -> Result<Self::Value, F> - where - F: de::Error, - { - if value == self.name.as_bytes() { - Ok(TagOrContent::Tag) - } else { - ContentVisitor::new() - .visit_borrowed_bytes(value) - .map(TagOrContent::Content) - } - } - - fn visit_byte_buf<F>(self, value: Vec<u8>) -> Result<Self::Value, F> - where - F: de::Error, - { - if value == self.name.as_bytes() { - Ok(TagOrContent::Tag) - } else { - ContentVisitor::new() - .visit_byte_buf(value) - .map(TagOrContent::Content) - } - } - - fn visit_unit<F>(self) -> Result<Self::Value, F> - where - F: de::Error, - { - ContentVisitor::new() - .visit_unit() - .map(TagOrContent::Content) - } - - fn visit_none<F>(self) -> Result<Self::Value, F> - where - F: de::Error, - { - ContentVisitor::new() - .visit_none() - .map(TagOrContent::Content) - } - - fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error> - where - D: Deserializer<'de>, - { - ContentVisitor::new() - .visit_some(deserializer) - .map(TagOrContent::Content) - } - - fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error> - where - D: Deserializer<'de>, - { - ContentVisitor::new() - .visit_newtype_struct(deserializer) - .map(TagOrContent::Content) - } - - fn visit_seq<V>(self, visitor: V) -> Result<Self::Value, V::Error> - where - V: SeqAccess<'de>, - { - ContentVisitor::new() - .visit_seq(visitor) - .map(TagOrContent::Content) - } - - fn visit_map<V>(self, visitor: V) -> Result<Self::Value, V::Error> - where - V: MapAccess<'de>, - { - ContentVisitor::new() - .visit_map(visitor) - .map(TagOrContent::Content) - } - - fn visit_enum<V>(self, visitor: V) -> Result<Self::Value, V::Error> - where - V: EnumAccess<'de>, - { - ContentVisitor::new() - .visit_enum(visitor) - .map(TagOrContent::Content) - } - } - - /// Used by generated code to deserialize an internally tagged enum. - /// - /// Not public API. - pub struct TaggedContentVisitor<T> { - tag_name: &'static str, - expecting: &'static str, - value: PhantomData<T>, - } - - impl<T> TaggedContentVisitor<T> { - /// Visitor for the content of an internally tagged enum with the given - /// tag name. - pub fn new(name: &'static str, expecting: &'static str) -> Self { - TaggedContentVisitor { - tag_name: name, - expecting, - value: PhantomData, - } - } - } - - impl<'de, T> Visitor<'de> for TaggedContentVisitor<T> - where - T: Deserialize<'de>, - { - type Value = (T, Content<'de>); - - fn expecting(&self, fmt: &mut fmt::Formatter) -> fmt::Result { - fmt.write_str(self.expecting) - } - - fn visit_seq<S>(self, mut seq: S) -> Result<Self::Value, S::Error> - where - S: SeqAccess<'de>, - { - let tag = match tri!(seq.next_element()) { - Some(tag) => tag, - None => { - return Err(de::Error::missing_field(self.tag_name)); - } - }; - let rest = de::value::SeqAccessDeserializer::new(seq); - Ok((tag, tri!(Content::deserialize(rest)))) - } - - fn visit_map<M>(self, mut map: M) -> Result<Self::Value, M::Error> - where - M: MapAccess<'de>, - { - let mut tag = None; - let mut vec = Vec::<(Content, Content)>::with_capacity(size_hint::cautious::<( - Content, - Content, - )>(map.size_hint())); - while let Some(k) = tri!(map.next_key_seed(TagOrContentVisitor::new(self.tag_name))) { - match k { - TagOrContent::Tag => { - if tag.is_some() { - return Err(de::Error::duplicate_field(self.tag_name)); - } - tag = Some(tri!(map.next_value())); - } - TagOrContent::Content(k) => { - let v = tri!(map.next_value()); - vec.push((k, v)); - } - } - } - match tag { - None => Err(de::Error::missing_field(self.tag_name)), - Some(tag) => Ok((tag, Content::Map(vec))), - } - } - } - - /// Used by generated code to deserialize an adjacently tagged enum. - /// - /// Not public API. - pub enum TagOrContentField { - Tag, - Content, - } - - /// Not public API. - pub struct TagOrContentFieldVisitor { - pub tag: &'static str, - pub content: &'static str, - } - - impl<'de> DeserializeSeed<'de> for TagOrContentFieldVisitor { - type Value = TagOrContentField; - - fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error> - where - D: Deserializer<'de>, - { - deserializer.deserialize_identifier(self) - } - } - - impl<'de> Visitor<'de> for TagOrContentFieldVisitor { - type Value = TagOrContentField; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - write!(formatter, "{:?} or {:?}", self.tag, self.content) - } - - fn visit_u64<E>(self, field_index: u64) -> Result<Self::Value, E> - where - E: de::Error, - { - match field_index { - 0 => Ok(TagOrContentField::Tag), - 1 => Ok(TagOrContentField::Content), - _ => Err(de::Error::invalid_value( - Unexpected::Unsigned(field_index), - &self, - )), - } - } - - fn visit_str<E>(self, field: &str) -> Result<Self::Value, E> - where - E: de::Error, - { - if field == self.tag { - Ok(TagOrContentField::Tag) - } else if field == self.content { - Ok(TagOrContentField::Content) - } else { - Err(de::Error::invalid_value(Unexpected::Str(field), &self)) - } - } - - fn visit_bytes<E>(self, field: &[u8]) -> Result<Self::Value, E> - where - E: de::Error, - { - if field == self.tag.as_bytes() { - Ok(TagOrContentField::Tag) - } else if field == self.content.as_bytes() { - Ok(TagOrContentField::Content) - } else { - Err(de::Error::invalid_value(Unexpected::Bytes(field), &self)) - } - } - } - - /// Used by generated code to deserialize an adjacently tagged enum when - /// ignoring unrelated fields is allowed. - /// - /// Not public API. - pub enum TagContentOtherField { - Tag, - Content, - Other, - } - - /// Not public API. - pub struct TagContentOtherFieldVisitor { - pub tag: &'static str, - pub content: &'static str, - } - - impl<'de> DeserializeSeed<'de> for TagContentOtherFieldVisitor { - type Value = TagContentOtherField; - - fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error> - where - D: Deserializer<'de>, - { - deserializer.deserialize_identifier(self) - } - } - - impl<'de> Visitor<'de> for TagContentOtherFieldVisitor { - type Value = TagContentOtherField; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - write!( - formatter, - "{:?}, {:?}, or other ignored fields", - self.tag, self.content - ) - } - - fn visit_u64<E>(self, field_index: u64) -> Result<Self::Value, E> - where - E: de::Error, - { - match field_index { - 0 => Ok(TagContentOtherField::Tag), - 1 => Ok(TagContentOtherField::Content), - _ => Ok(TagContentOtherField::Other), - } - } - - fn visit_str<E>(self, field: &str) -> Result<Self::Value, E> - where - E: de::Error, - { - self.visit_bytes(field.as_bytes()) - } - - fn visit_bytes<E>(self, field: &[u8]) -> Result<Self::Value, E> - where - E: de::Error, - { - if field == self.tag.as_bytes() { - Ok(TagContentOtherField::Tag) - } else if field == self.content.as_bytes() { - Ok(TagContentOtherField::Content) - } else { - Ok(TagContentOtherField::Other) - } - } - } - - /// Not public API - pub struct ContentDeserializer<'de, E> { - content: Content<'de>, - err: PhantomData<E>, - } - - impl<'de, E> ContentDeserializer<'de, E> - where - E: de::Error, - { - #[cold] - fn invalid_type(self, exp: &Expected) -> E { - de::Error::invalid_type(self.content.unexpected(), exp) - } - - fn deserialize_integer<V>(self, visitor: V) -> Result<V::Value, E> - where - V: Visitor<'de>, - { - match self.content { - Content::U8(v) => visitor.visit_u8(v), - Content::U16(v) => visitor.visit_u16(v), - Content::U32(v) => visitor.visit_u32(v), - Content::U64(v) => visitor.visit_u64(v), - Content::I8(v) => visitor.visit_i8(v), - Content::I16(v) => visitor.visit_i16(v), - Content::I32(v) => visitor.visit_i32(v), - Content::I64(v) => visitor.visit_i64(v), - _ => Err(self.invalid_type(&visitor)), - } - } - - fn deserialize_float<V>(self, visitor: V) -> Result<V::Value, E> - where - V: Visitor<'de>, - { - match self.content { - Content::F32(v) => visitor.visit_f32(v), - Content::F64(v) => visitor.visit_f64(v), - Content::U8(v) => visitor.visit_u8(v), - Content::U16(v) => visitor.visit_u16(v), - Content::U32(v) => visitor.visit_u32(v), - Content::U64(v) => visitor.visit_u64(v), - Content::I8(v) => visitor.visit_i8(v), - Content::I16(v) => visitor.visit_i16(v), - Content::I32(v) => visitor.visit_i32(v), - Content::I64(v) => visitor.visit_i64(v), - _ => Err(self.invalid_type(&visitor)), - } - } - } - - fn visit_content_seq<'de, V, E>(content: Vec<Content<'de>>, visitor: V) -> Result<V::Value, E> - where - V: Visitor<'de>, - E: de::Error, - { - let seq = content.into_iter().map(ContentDeserializer::new); - let mut seq_visitor = SeqDeserializer::new(seq); - let value = tri!(visitor.visit_seq(&mut seq_visitor)); - tri!(seq_visitor.end()); - Ok(value) - } - - fn visit_content_map<'de, V, E>( - content: Vec<(Content<'de>, Content<'de>)>, - visitor: V, - ) -> Result<V::Value, E> - where - V: Visitor<'de>, - E: de::Error, - { - let map = content - .into_iter() - .map(|(k, v)| (ContentDeserializer::new(k), ContentDeserializer::new(v))); - let mut map_visitor = MapDeserializer::new(map); - let value = tri!(visitor.visit_map(&mut map_visitor)); - tri!(map_visitor.end()); - Ok(value) - } - - /// Used when deserializing an internally tagged enum because the content - /// will be used exactly once. - impl<'de, E> Deserializer<'de> for ContentDeserializer<'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>, - { - match self.content { - Content::Bool(v) => visitor.visit_bool(v), - Content::U8(v) => visitor.visit_u8(v), - Content::U16(v) => visitor.visit_u16(v), - Content::U32(v) => visitor.visit_u32(v), - Content::U64(v) => visitor.visit_u64(v), - Content::I8(v) => visitor.visit_i8(v), - Content::I16(v) => visitor.visit_i16(v), - Content::I32(v) => visitor.visit_i32(v), - Content::I64(v) => visitor.visit_i64(v), - Content::F32(v) => visitor.visit_f32(v), - Content::F64(v) => visitor.visit_f64(v), - Content::Char(v) => visitor.visit_char(v), - Content::String(v) => visitor.visit_string(v), - Content::Str(v) => visitor.visit_borrowed_str(v), - Content::ByteBuf(v) => visitor.visit_byte_buf(v), - Content::Bytes(v) => visitor.visit_borrowed_bytes(v), - Content::Unit => visitor.visit_unit(), - Content::None => visitor.visit_none(), - Content::Some(v) => visitor.visit_some(ContentDeserializer::new(*v)), - Content::Newtype(v) => visitor.visit_newtype_struct(ContentDeserializer::new(*v)), - Content::Seq(v) => visit_content_seq(v, visitor), - Content::Map(v) => visit_content_map(v, visitor), - } - } - - fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - match self.content { - Content::Bool(v) => visitor.visit_bool(v), - _ => Err(self.invalid_type(&visitor)), - } - } - - fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - self.deserialize_integer(visitor) - } - - fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - self.deserialize_integer(visitor) - } - - fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - self.deserialize_integer(visitor) - } - - fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - self.deserialize_integer(visitor) - } - - fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - self.deserialize_integer(visitor) - } - - fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - self.deserialize_integer(visitor) - } - - fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - self.deserialize_integer(visitor) - } - - fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - self.deserialize_integer(visitor) - } - - fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - self.deserialize_float(visitor) - } - - fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - self.deserialize_float(visitor) - } - - fn deserialize_char<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - match self.content { - Content::Char(v) => visitor.visit_char(v), - Content::String(v) => visitor.visit_string(v), - Content::Str(v) => visitor.visit_borrowed_str(v), - _ => Err(self.invalid_type(&visitor)), - } - } - - fn deserialize_str<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - self.deserialize_string(visitor) - } - - fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - match self.content { - Content::String(v) => visitor.visit_string(v), - Content::Str(v) => visitor.visit_borrowed_str(v), - Content::ByteBuf(v) => visitor.visit_byte_buf(v), - Content::Bytes(v) => visitor.visit_borrowed_bytes(v), - _ => Err(self.invalid_type(&visitor)), - } - } - - fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - self.deserialize_byte_buf(visitor) - } - - fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - match self.content { - Content::String(v) => visitor.visit_string(v), - Content::Str(v) => visitor.visit_borrowed_str(v), - Content::ByteBuf(v) => visitor.visit_byte_buf(v), - Content::Bytes(v) => visitor.visit_borrowed_bytes(v), - Content::Seq(v) => visit_content_seq(v, visitor), - _ => Err(self.invalid_type(&visitor)), - } - } - - fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - match self.content { - Content::None => visitor.visit_none(), - Content::Some(v) => visitor.visit_some(ContentDeserializer::new(*v)), - Content::Unit => visitor.visit_unit(), - _ => visitor.visit_some(self), - } - } - - fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - match self.content { - Content::Unit => visitor.visit_unit(), - - // Allow deserializing newtype variant containing unit. - // - // #[derive(Deserialize)] - // #[serde(tag = "result")] - // enum Response<T> { - // Success(T), - // } - // - // We want {"result":"Success"} to deserialize into Response<()>. - Content::Map(ref v) if v.is_empty() => visitor.visit_unit(), - _ => Err(self.invalid_type(&visitor)), - } - } - - fn deserialize_unit_struct<V>( - self, - _name: &'static str, - visitor: V, - ) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - match self.content { - // As a special case, allow deserializing untagged newtype - // variant containing unit struct. - // - // #[derive(Deserialize)] - // struct Info; - // - // #[derive(Deserialize)] - // #[serde(tag = "topic")] - // enum Message { - // Info(Info), - // } - // - // We want {"topic":"Info"} to deserialize even though - // ordinarily unit structs do not deserialize from empty map/seq. - Content::Map(ref v) if v.is_empty() => visitor.visit_unit(), - Content::Seq(ref v) if v.is_empty() => visitor.visit_unit(), - _ => self.deserialize_any(visitor), - } - } - - fn deserialize_newtype_struct<V>( - self, - _name: &str, - visitor: V, - ) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - match self.content { - Content::Newtype(v) => visitor.visit_newtype_struct(ContentDeserializer::new(*v)), - _ => visitor.visit_newtype_struct(self), - } - } - - fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - match self.content { - Content::Seq(v) => visit_content_seq(v, visitor), - _ => Err(self.invalid_type(&visitor)), - } - } - - fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - self.deserialize_seq(visitor) - } - - fn deserialize_tuple_struct<V>( - self, - _name: &'static str, - _len: usize, - visitor: V, - ) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - self.deserialize_seq(visitor) - } - - fn deserialize_map<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - match self.content { - Content::Map(v) => visit_content_map(v, visitor), - _ => Err(self.invalid_type(&visitor)), - } - } - - fn deserialize_struct<V>( - self, - _name: &'static str, - _fields: &'static [&'static str], - visitor: V, - ) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - match self.content { - Content::Seq(v) => visit_content_seq(v, visitor), - Content::Map(v) => visit_content_map(v, visitor), - _ => Err(self.invalid_type(&visitor)), - } - } - - fn deserialize_enum<V>( - self, - _name: &str, - _variants: &'static [&'static str], - visitor: V, - ) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - let (variant, value) = match self.content { - Content::Map(value) => { - let mut iter = value.into_iter(); - let (variant, value) = match iter.next() { - Some(v) => v, - None => { - return Err(de::Error::invalid_value( - de::Unexpected::Map, - &"map with a single key", - )); - } - }; - // enums are encoded in json as maps with a single key:value pair - if iter.next().is_some() { - return Err(de::Error::invalid_value( - de::Unexpected::Map, - &"map with a single key", - )); - } - (variant, Some(value)) - } - s @ Content::String(_) | s @ Content::Str(_) => (s, None), - other => { - return Err(de::Error::invalid_type( - other.unexpected(), - &"string or map", - )); - } - }; - - visitor.visit_enum(EnumDeserializer::new(variant, value)) - } - - fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - match self.content { - Content::String(v) => visitor.visit_string(v), - Content::Str(v) => visitor.visit_borrowed_str(v), - Content::ByteBuf(v) => visitor.visit_byte_buf(v), - Content::Bytes(v) => visitor.visit_borrowed_bytes(v), - Content::U8(v) => visitor.visit_u8(v), - Content::U64(v) => visitor.visit_u64(v), - _ => Err(self.invalid_type(&visitor)), - } - } - - fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - drop(self); - visitor.visit_unit() - } - - fn __deserialize_content<V>( - self, - _: actually_private::T, - visitor: V, - ) -> Result<Content<'de>, Self::Error> - where - V: Visitor<'de, Value = Content<'de>>, - { - let _ = visitor; - Ok(self.content) - } - } - - impl<'de, E> ContentDeserializer<'de, E> { - /// private API, don't use - pub fn new(content: Content<'de>) -> Self { - ContentDeserializer { - content, - err: PhantomData, - } - } - } - - pub struct EnumDeserializer<'de, E> - where - E: de::Error, - { - variant: Content<'de>, - value: Option<Content<'de>>, - err: PhantomData<E>, - } - - impl<'de, E> EnumDeserializer<'de, E> - where - E: de::Error, - { - pub fn new(variant: Content<'de>, value: Option<Content<'de>>) -> EnumDeserializer<'de, E> { - EnumDeserializer { - variant, - value, - err: PhantomData, - } - } - } - - impl<'de, E> de::EnumAccess<'de> for EnumDeserializer<'de, E> - where - E: de::Error, - { - type Error = E; - type Variant = VariantDeserializer<'de, Self::Error>; - - fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), E> - where - V: de::DeserializeSeed<'de>, - { - let visitor = VariantDeserializer { - value: self.value, - err: PhantomData, - }; - seed.deserialize(ContentDeserializer::new(self.variant)) - .map(|v| (v, visitor)) - } - } - - pub struct VariantDeserializer<'de, E> - where - E: de::Error, - { - value: Option<Content<'de>>, - err: PhantomData<E>, - } - - impl<'de, E> de::VariantAccess<'de> for VariantDeserializer<'de, E> - where - E: de::Error, - { - type Error = E; - - fn unit_variant(self) -> Result<(), E> { - match self.value { - Some(value) => de::Deserialize::deserialize(ContentDeserializer::new(value)), - None => Ok(()), - } - } - - fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, E> - where - T: de::DeserializeSeed<'de>, - { - match self.value { - Some(value) => seed.deserialize(ContentDeserializer::new(value)), - None => Err(de::Error::invalid_type( - de::Unexpected::UnitVariant, - &"newtype variant", - )), - } - } - - fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error> - where - V: de::Visitor<'de>, - { - match self.value { - Some(Content::Seq(v)) => { - de::Deserializer::deserialize_any(SeqDeserializer::new(v.into_iter()), visitor) - } - Some(other) => Err(de::Error::invalid_type( - other.unexpected(), - &"tuple variant", - )), - None => Err(de::Error::invalid_type( - de::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>, - { - match self.value { - Some(Content::Map(v)) => { - de::Deserializer::deserialize_any(MapDeserializer::new(v.into_iter()), visitor) - } - Some(Content::Seq(v)) => { - de::Deserializer::deserialize_any(SeqDeserializer::new(v.into_iter()), visitor) - } - Some(other) => Err(de::Error::invalid_type( - other.unexpected(), - &"struct variant", - )), - None => Err(de::Error::invalid_type( - de::Unexpected::UnitVariant, - &"struct variant", - )), - } - } - } - - /// Not public API. - pub struct ContentRefDeserializer<'a, 'de: 'a, E> { - content: &'a Content<'de>, - err: PhantomData<E>, - } - - impl<'a, 'de, E> ContentRefDeserializer<'a, 'de, E> - where - E: de::Error, - { - #[cold] - fn invalid_type(self, exp: &Expected) -> E { - de::Error::invalid_type(self.content.unexpected(), exp) - } - - fn deserialize_integer<V>(self, visitor: V) -> Result<V::Value, E> - where - V: Visitor<'de>, - { - match *self.content { - Content::U8(v) => visitor.visit_u8(v), - Content::U16(v) => visitor.visit_u16(v), - Content::U32(v) => visitor.visit_u32(v), - Content::U64(v) => visitor.visit_u64(v), - Content::I8(v) => visitor.visit_i8(v), - Content::I16(v) => visitor.visit_i16(v), - Content::I32(v) => visitor.visit_i32(v), - Content::I64(v) => visitor.visit_i64(v), - _ => Err(self.invalid_type(&visitor)), - } - } - - fn deserialize_float<V>(self, visitor: V) -> Result<V::Value, E> - where - V: Visitor<'de>, - { - match *self.content { - Content::F32(v) => visitor.visit_f32(v), - Content::F64(v) => visitor.visit_f64(v), - Content::U8(v) => visitor.visit_u8(v), - Content::U16(v) => visitor.visit_u16(v), - Content::U32(v) => visitor.visit_u32(v), - Content::U64(v) => visitor.visit_u64(v), - Content::I8(v) => visitor.visit_i8(v), - Content::I16(v) => visitor.visit_i16(v), - Content::I32(v) => visitor.visit_i32(v), - Content::I64(v) => visitor.visit_i64(v), - _ => Err(self.invalid_type(&visitor)), - } - } - } - - fn visit_content_seq_ref<'a, 'de, V, E>( - content: &'a [Content<'de>], - visitor: V, - ) -> Result<V::Value, E> - where - V: Visitor<'de>, - E: de::Error, - { - let seq = content.iter().map(ContentRefDeserializer::new); - let mut seq_visitor = SeqDeserializer::new(seq); - let value = tri!(visitor.visit_seq(&mut seq_visitor)); - tri!(seq_visitor.end()); - Ok(value) - } - - fn visit_content_map_ref<'a, 'de, V, E>( - content: &'a [(Content<'de>, Content<'de>)], - visitor: V, - ) -> Result<V::Value, E> - where - V: Visitor<'de>, - E: de::Error, - { - let map = content.iter().map(|(k, v)| { - ( - ContentRefDeserializer::new(k), - ContentRefDeserializer::new(v), - ) - }); - let mut map_visitor = MapDeserializer::new(map); - let value = tri!(visitor.visit_map(&mut map_visitor)); - tri!(map_visitor.end()); - Ok(value) - } - - /// Used when deserializing an untagged enum because the content may need - /// to be used more than once. - impl<'de, 'a, E> Deserializer<'de> for ContentRefDeserializer<'a, 'de, E> - where - E: de::Error, - { - type Error = E; - - fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, E> - where - V: Visitor<'de>, - { - match *self.content { - Content::Bool(v) => visitor.visit_bool(v), - Content::U8(v) => visitor.visit_u8(v), - Content::U16(v) => visitor.visit_u16(v), - Content::U32(v) => visitor.visit_u32(v), - Content::U64(v) => visitor.visit_u64(v), - Content::I8(v) => visitor.visit_i8(v), - Content::I16(v) => visitor.visit_i16(v), - Content::I32(v) => visitor.visit_i32(v), - Content::I64(v) => visitor.visit_i64(v), - Content::F32(v) => visitor.visit_f32(v), - Content::F64(v) => visitor.visit_f64(v), - Content::Char(v) => visitor.visit_char(v), - Content::String(ref v) => visitor.visit_str(v), - Content::Str(v) => visitor.visit_borrowed_str(v), - Content::ByteBuf(ref v) => visitor.visit_bytes(v), - Content::Bytes(v) => visitor.visit_borrowed_bytes(v), - Content::Unit => visitor.visit_unit(), - Content::None => visitor.visit_none(), - Content::Some(ref v) => visitor.visit_some(ContentRefDeserializer::new(v)), - Content::Newtype(ref v) => { - visitor.visit_newtype_struct(ContentRefDeserializer::new(v)) - } - Content::Seq(ref v) => visit_content_seq_ref(v, visitor), - Content::Map(ref v) => visit_content_map_ref(v, visitor), - } - } - - fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - match *self.content { - Content::Bool(v) => visitor.visit_bool(v), - _ => Err(self.invalid_type(&visitor)), - } - } - - fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - self.deserialize_integer(visitor) - } - - fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - self.deserialize_integer(visitor) - } - - fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - self.deserialize_integer(visitor) - } - - fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - self.deserialize_integer(visitor) - } - - fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - self.deserialize_integer(visitor) - } - - fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - self.deserialize_integer(visitor) - } - - fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - self.deserialize_integer(visitor) - } - - fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - self.deserialize_integer(visitor) - } - - fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - self.deserialize_float(visitor) - } - - fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - self.deserialize_float(visitor) - } - - fn deserialize_char<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - match *self.content { - Content::Char(v) => visitor.visit_char(v), - Content::String(ref v) => visitor.visit_str(v), - Content::Str(v) => visitor.visit_borrowed_str(v), - _ => Err(self.invalid_type(&visitor)), - } - } - - fn deserialize_str<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - match *self.content { - Content::String(ref v) => visitor.visit_str(v), - Content::Str(v) => visitor.visit_borrowed_str(v), - Content::ByteBuf(ref v) => visitor.visit_bytes(v), - Content::Bytes(v) => visitor.visit_borrowed_bytes(v), - _ => Err(self.invalid_type(&visitor)), - } - } - - fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - self.deserialize_str(visitor) - } - - fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - match *self.content { - Content::String(ref v) => visitor.visit_str(v), - Content::Str(v) => visitor.visit_borrowed_str(v), - Content::ByteBuf(ref v) => visitor.visit_bytes(v), - Content::Bytes(v) => visitor.visit_borrowed_bytes(v), - Content::Seq(ref v) => visit_content_seq_ref(v, visitor), - _ => Err(self.invalid_type(&visitor)), - } - } - - fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - self.deserialize_bytes(visitor) - } - - fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, E> - where - V: Visitor<'de>, - { - match *self.content { - Content::None => visitor.visit_none(), - Content::Some(ref v) => visitor.visit_some(ContentRefDeserializer::new(v)), - Content::Unit => visitor.visit_unit(), - _ => visitor.visit_some(self), - } - } - - fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - match *self.content { - Content::Unit => visitor.visit_unit(), - _ => Err(self.invalid_type(&visitor)), - } - } - - fn deserialize_unit_struct<V>( - self, - _name: &'static str, - visitor: V, - ) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - self.deserialize_unit(visitor) - } - - fn deserialize_newtype_struct<V>(self, _name: &str, visitor: V) -> Result<V::Value, E> - where - V: Visitor<'de>, - { - match *self.content { - Content::Newtype(ref v) => { - visitor.visit_newtype_struct(ContentRefDeserializer::new(v)) - } - _ => visitor.visit_newtype_struct(self), - } - } - - fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - match *self.content { - Content::Seq(ref v) => visit_content_seq_ref(v, visitor), - _ => Err(self.invalid_type(&visitor)), - } - } - - fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - self.deserialize_seq(visitor) - } - - fn deserialize_tuple_struct<V>( - self, - _name: &'static str, - _len: usize, - visitor: V, - ) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - self.deserialize_seq(visitor) - } - - fn deserialize_map<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - match *self.content { - Content::Map(ref v) => visit_content_map_ref(v, visitor), - _ => Err(self.invalid_type(&visitor)), - } - } - - fn deserialize_struct<V>( - self, - _name: &'static str, - _fields: &'static [&'static str], - visitor: V, - ) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - match *self.content { - Content::Seq(ref v) => visit_content_seq_ref(v, visitor), - Content::Map(ref v) => visit_content_map_ref(v, visitor), - _ => Err(self.invalid_type(&visitor)), - } - } - - fn deserialize_enum<V>( - self, - _name: &str, - _variants: &'static [&'static str], - visitor: V, - ) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - let (variant, value) = match *self.content { - Content::Map(ref value) => { - let mut iter = value.iter(); - let (variant, value) = match iter.next() { - Some(v) => v, - None => { - return Err(de::Error::invalid_value( - de::Unexpected::Map, - &"map with a single key", - )); - } - }; - // enums are encoded in json as maps with a single key:value pair - if iter.next().is_some() { - return Err(de::Error::invalid_value( - de::Unexpected::Map, - &"map with a single key", - )); - } - (variant, Some(value)) - } - ref s @ Content::String(_) | ref s @ Content::Str(_) => (s, None), - ref other => { - return Err(de::Error::invalid_type( - other.unexpected(), - &"string or map", - )); - } - }; - - visitor.visit_enum(EnumRefDeserializer { - variant, - value, - err: PhantomData, - }) - } - - fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - match *self.content { - Content::String(ref v) => visitor.visit_str(v), - Content::Str(v) => visitor.visit_borrowed_str(v), - Content::ByteBuf(ref v) => visitor.visit_bytes(v), - Content::Bytes(v) => visitor.visit_borrowed_bytes(v), - Content::U8(v) => visitor.visit_u8(v), - Content::U64(v) => visitor.visit_u64(v), - _ => Err(self.invalid_type(&visitor)), - } - } - - fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - visitor.visit_unit() - } - - fn __deserialize_content<V>( - self, - _: actually_private::T, - visitor: V, - ) -> Result<Content<'de>, Self::Error> - where - V: Visitor<'de, Value = Content<'de>>, - { - let _ = visitor; - Ok(self.content.clone()) - } - } - - impl<'a, 'de, E> ContentRefDeserializer<'a, 'de, E> { - /// private API, don't use - pub fn new(content: &'a Content<'de>) -> Self { - ContentRefDeserializer { - content, - err: PhantomData, - } - } - } - - impl<'a, 'de: 'a, E> Copy for ContentRefDeserializer<'a, 'de, E> {} - - impl<'a, 'de: 'a, E> Clone for ContentRefDeserializer<'a, 'de, E> { - fn clone(&self) -> Self { - *self - } - } - - struct EnumRefDeserializer<'a, 'de: 'a, E> - where - E: de::Error, - { - variant: &'a Content<'de>, - value: Option<&'a Content<'de>>, - err: PhantomData<E>, - } - - impl<'de, 'a, E> de::EnumAccess<'de> for EnumRefDeserializer<'a, 'de, E> - where - E: de::Error, - { - type Error = E; - type Variant = VariantRefDeserializer<'a, 'de, Self::Error>; - - fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), Self::Error> - where - V: de::DeserializeSeed<'de>, - { - let visitor = VariantRefDeserializer { - value: self.value, - err: PhantomData, - }; - seed.deserialize(ContentRefDeserializer::new(self.variant)) - .map(|v| (v, visitor)) - } - } - - struct VariantRefDeserializer<'a, 'de: 'a, E> - where - E: de::Error, - { - value: Option<&'a Content<'de>>, - err: PhantomData<E>, - } - - impl<'de, 'a, E> de::VariantAccess<'de> for VariantRefDeserializer<'a, 'de, E> - where - E: de::Error, - { - type Error = E; - - fn unit_variant(self) -> Result<(), E> { - match self.value { - Some(value) => de::Deserialize::deserialize(ContentRefDeserializer::new(value)), - None => Ok(()), - } - } - - fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, E> - where - T: de::DeserializeSeed<'de>, - { - match self.value { - Some(value) => seed.deserialize(ContentRefDeserializer::new(value)), - None => Err(de::Error::invalid_type( - de::Unexpected::UnitVariant, - &"newtype variant", - )), - } - } - - fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error> - where - V: de::Visitor<'de>, - { - match self.value { - Some(Content::Seq(v)) => { - de::Deserializer::deserialize_any(SeqRefDeserializer::new(v), visitor) - } - Some(other) => Err(de::Error::invalid_type( - other.unexpected(), - &"tuple variant", - )), - None => Err(de::Error::invalid_type( - de::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>, - { - match self.value { - Some(Content::Map(v)) => { - de::Deserializer::deserialize_any(MapRefDeserializer::new(v), visitor) - } - Some(Content::Seq(v)) => { - de::Deserializer::deserialize_any(SeqRefDeserializer::new(v), visitor) - } - Some(other) => Err(de::Error::invalid_type( - other.unexpected(), - &"struct variant", - )), - None => Err(de::Error::invalid_type( - de::Unexpected::UnitVariant, - &"struct variant", - )), - } - } - } - - struct SeqRefDeserializer<'a, 'de: 'a, E> - where - E: de::Error, - { - iter: <&'a [Content<'de>] as IntoIterator>::IntoIter, - err: PhantomData<E>, - } - - impl<'a, 'de, E> SeqRefDeserializer<'a, 'de, E> - where - E: de::Error, - { - fn new(slice: &'a [Content<'de>]) -> Self { - SeqRefDeserializer { - iter: slice.iter(), - err: PhantomData, - } - } - } - - impl<'de, 'a, E> de::Deserializer<'de> for SeqRefDeserializer<'a, 'de, E> - where - E: de::Error, - { - type Error = E; - - #[inline] - fn deserialize_any<V>(mut self, visitor: V) -> Result<V::Value, Self::Error> - where - V: de::Visitor<'de>, - { - let len = self.iter.len(); - if len == 0 { - visitor.visit_unit() - } else { - let ret = tri!(visitor.visit_seq(&mut self)); - let remaining = self.iter.len(); - if remaining == 0 { - Ok(ret) - } else { - Err(de::Error::invalid_length(len, &"fewer elements in array")) - } - } - } - - 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, 'a, E> de::SeqAccess<'de> for SeqRefDeserializer<'a, 'de, E> - where - 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.iter.next() { - Some(value) => seed - .deserialize(ContentRefDeserializer::new(value)) - .map(Some), - None => Ok(None), - } - } - - fn size_hint(&self) -> Option<usize> { - size_hint::from_bounds(&self.iter) - } - } - - struct MapRefDeserializer<'a, 'de: 'a, E> - where - E: de::Error, - { - iter: <&'a [(Content<'de>, Content<'de>)] as IntoIterator>::IntoIter, - value: Option<&'a Content<'de>>, - err: PhantomData<E>, - } - - impl<'a, 'de, E> MapRefDeserializer<'a, 'de, E> - where - E: de::Error, - { - fn new(map: &'a [(Content<'de>, Content<'de>)]) -> Self { - MapRefDeserializer { - iter: map.iter(), - value: None, - err: PhantomData, - } - } - } - - impl<'de, 'a, E> de::MapAccess<'de> for MapRefDeserializer<'a, 'de, E> - where - 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.iter.next() { - Some((key, value)) => { - self.value = Some(value); - seed.deserialize(ContentRefDeserializer::new(key)).map(Some) - } - None => Ok(None), - } - } - - fn next_value_seed<T>(&mut self, seed: T) -> Result<T::Value, Self::Error> - where - T: de::DeserializeSeed<'de>, - { - match self.value.take() { - Some(value) => seed.deserialize(ContentRefDeserializer::new(value)), - None => Err(de::Error::custom("value is missing")), - } - } - - fn size_hint(&self) -> Option<usize> { - size_hint::from_bounds(&self.iter) - } - } - - impl<'de, 'a, E> de::Deserializer<'de> for MapRefDeserializer<'a, 'de, E> - where - E: de::Error, - { - type Error = E; - - #[inline] - fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: de::Visitor<'de>, - { - visitor.visit_map(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 enum identifier ignored_any - } - } - - impl<'de, E> de::IntoDeserializer<'de, E> for ContentDeserializer<'de, E> - where - E: de::Error, - { - type Deserializer = Self; - - fn into_deserializer(self) -> Self { - self - } - } - - impl<'de, 'a, E> de::IntoDeserializer<'de, E> for ContentRefDeserializer<'a, 'de, E> - where - E: de::Error, - { - type Deserializer = Self; - - fn into_deserializer(self) -> Self { - self - } - } - - /// Visitor for deserializing an internally tagged unit variant. - /// - /// Not public API. - pub struct InternallyTaggedUnitVisitor<'a> { - type_name: &'a str, - variant_name: &'a str, - } - - impl<'a> InternallyTaggedUnitVisitor<'a> { - /// Not public API. - pub fn new(type_name: &'a str, variant_name: &'a str) -> Self { - InternallyTaggedUnitVisitor { - type_name, - variant_name, - } - } - } - - impl<'de, 'a> Visitor<'de> for InternallyTaggedUnitVisitor<'a> { - type Value = (); - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - write!( - formatter, - "unit variant {}::{}", - self.type_name, self.variant_name - ) - } - - fn visit_seq<S>(self, _: S) -> Result<(), S::Error> - where - S: SeqAccess<'de>, - { - Ok(()) - } - - fn visit_map<M>(self, mut access: M) -> Result<(), M::Error> - where - M: MapAccess<'de>, - { - while tri!(access.next_entry::<IgnoredAny, IgnoredAny>()).is_some() {} - Ok(()) - } - } - - /// Visitor for deserializing an untagged unit variant. - /// - /// Not public API. - pub struct UntaggedUnitVisitor<'a> { - type_name: &'a str, - variant_name: &'a str, - } - - impl<'a> UntaggedUnitVisitor<'a> { - /// Not public API. - pub fn new(type_name: &'a str, variant_name: &'a str) -> Self { - UntaggedUnitVisitor { - type_name, - variant_name, - } - } - } - - impl<'de, 'a> Visitor<'de> for UntaggedUnitVisitor<'a> { - type Value = (); - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - write!( - formatter, - "unit variant {}::{}", - self.type_name, self.variant_name - ) - } - - fn visit_unit<E>(self) -> Result<(), E> - where - E: de::Error, - { - Ok(()) - } - - fn visit_none<E>(self) -> Result<(), E> - where - E: de::Error, - { - Ok(()) - } - } -} - -//////////////////////////////////////////////////////////////////////////////// - -// Like `IntoDeserializer` but also implemented for `&[u8]`. This is used for -// the newtype fallthrough case of `field_identifier`. -// -// #[derive(Deserialize)] -// #[serde(field_identifier)] -// enum F { -// A, -// B, -// Other(String), // deserialized using IdentifierDeserializer -// } -pub trait IdentifierDeserializer<'de, E: Error> { - type Deserializer: Deserializer<'de, Error = E>; - - fn from(self) -> Self::Deserializer; -} - -pub struct Borrowed<'de, T: 'de + ?Sized>(pub &'de T); - -impl<'de, E> IdentifierDeserializer<'de, E> for u64 -where - E: Error, -{ - type Deserializer = <u64 as IntoDeserializer<'de, E>>::Deserializer; - - fn from(self) -> Self::Deserializer { - self.into_deserializer() - } -} - -pub struct StrDeserializer<'a, E> { - value: &'a str, - marker: PhantomData<E>, -} - -impl<'de, 'a, E> Deserializer<'de> for StrDeserializer<'a, E> -where - E: Error, -{ - type Error = E; - - fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - visitor.visit_str(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 - } -} - -pub struct BorrowedStrDeserializer<'de, E> { - value: &'de str, - marker: PhantomData<E>, -} - -impl<'de, E> Deserializer<'de> for BorrowedStrDeserializer<'de, E> -where - E: Error, -{ - type Error = E; - - fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - visitor.visit_borrowed_str(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> IdentifierDeserializer<'a, E> for &'a str -where - E: Error, -{ - type Deserializer = StrDeserializer<'a, E>; - - fn from(self) -> Self::Deserializer { - StrDeserializer { - value: self, - marker: PhantomData, - } - } -} - -impl<'de, E> IdentifierDeserializer<'de, E> for Borrowed<'de, str> -where - E: Error, -{ - type Deserializer = BorrowedStrDeserializer<'de, E>; - - fn from(self) -> Self::Deserializer { - BorrowedStrDeserializer { - value: self.0, - marker: PhantomData, - } - } -} - -impl<'a, E> IdentifierDeserializer<'a, E> for &'a [u8] -where - E: Error, -{ - type Deserializer = BytesDeserializer<'a, E>; - - fn from(self) -> Self::Deserializer { - BytesDeserializer::new(self) - } -} - -impl<'de, E> IdentifierDeserializer<'de, E> for Borrowed<'de, [u8]> -where - E: Error, -{ - type Deserializer = BorrowedBytesDeserializer<'de, E>; - - fn from(self) -> Self::Deserializer { - BorrowedBytesDeserializer::new(self.0) - } -} - -#[cfg(any(feature = "std", feature = "alloc"))] -pub struct FlatMapDeserializer<'a, 'de: 'a, E>( - pub &'a mut Vec<Option<(Content<'de>, Content<'de>)>>, - pub PhantomData<E>, -); - -#[cfg(any(feature = "std", feature = "alloc"))] -impl<'a, 'de, E> FlatMapDeserializer<'a, 'de, E> -where - E: Error, -{ - fn deserialize_other<V>() -> Result<V, E> { - Err(Error::custom("can only flatten structs and maps")) - } -} - -#[cfg(any(feature = "std", feature = "alloc"))] -macro_rules! forward_to_deserialize_other { - ($($func:ident ($($arg:ty),*))*) => { - $( - fn $func<V>(self, $(_: $arg,)* _visitor: V) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - Self::deserialize_other() - } - )* - } -} - -#[cfg(any(feature = "std", feature = "alloc"))] -impl<'a, 'de, E> Deserializer<'de> for FlatMapDeserializer<'a, 'de, E> -where - E: Error, -{ - type Error = E; - - fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - self.deserialize_map(visitor) - } - - fn deserialize_enum<V>( - self, - name: &'static str, - variants: &'static [&'static str], - visitor: V, - ) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - for entry in self.0 { - if let Some((key, value)) = flat_map_take_entry(entry, variants) { - return visitor.visit_enum(EnumDeserializer::new(key, Some(value))); - } - } - - Err(Error::custom(format_args!( - "no variant of enum {} found in flattened data", - name - ))) - } - - fn deserialize_map<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - visitor.visit_map(FlatMapAccess { - iter: self.0.iter(), - pending_content: None, - _marker: PhantomData, - }) - } - - fn deserialize_struct<V>( - self, - _: &'static str, - fields: &'static [&'static str], - visitor: V, - ) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - visitor.visit_map(FlatStructAccess { - iter: self.0.iter_mut(), - pending_content: None, - fields, - _marker: PhantomData, - }) - } - - fn deserialize_newtype_struct<V>(self, _name: &str, visitor: V) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - visitor.visit_newtype_struct(self) - } - - fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - match visitor.__private_visit_untagged_option(self) { - Ok(value) => Ok(value), - Err(()) => Self::deserialize_other(), - } - } - - fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - visitor.visit_unit() - } - - fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> - where - V: Visitor<'de>, - { - visitor.visit_unit() - } - - forward_to_deserialize_other! { - deserialize_bool() - deserialize_i8() - deserialize_i16() - deserialize_i32() - deserialize_i64() - deserialize_u8() - deserialize_u16() - deserialize_u32() - deserialize_u64() - deserialize_f32() - deserialize_f64() - deserialize_char() - deserialize_str() - deserialize_string() - deserialize_bytes() - deserialize_byte_buf() - deserialize_unit_struct(&'static str) - deserialize_seq() - deserialize_tuple(usize) - deserialize_tuple_struct(&'static str, usize) - deserialize_identifier() - } -} - -#[cfg(any(feature = "std", feature = "alloc"))] -struct FlatMapAccess<'a, 'de: 'a, E> { - iter: slice::Iter<'a, Option<(Content<'de>, Content<'de>)>>, - pending_content: Option<&'a Content<'de>>, - _marker: PhantomData<E>, -} - -#[cfg(any(feature = "std", feature = "alloc"))] -impl<'a, 'de, E> MapAccess<'de> for FlatMapAccess<'a, 'de, E> -where - E: Error, -{ - type Error = E; - - fn next_key_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error> - where - T: DeserializeSeed<'de>, - { - for item in &mut self.iter { - // Items in the vector are nulled out when used by a struct. - if let Some((ref key, ref content)) = *item { - // Do not take(), instead borrow this entry. The internally tagged - // enum does its own buffering so we can't tell whether this entry - // is going to be consumed. Borrowing here leaves the entry - // available for later flattened fields. - self.pending_content = Some(content); - return seed.deserialize(ContentRefDeserializer::new(key)).map(Some); - } - } - Ok(None) - } - - fn next_value_seed<T>(&mut self, seed: T) -> Result<T::Value, Self::Error> - where - T: DeserializeSeed<'de>, - { - match self.pending_content.take() { - Some(value) => seed.deserialize(ContentRefDeserializer::new(value)), - None => Err(Error::custom("value is missing")), - } - } -} - -#[cfg(any(feature = "std", feature = "alloc"))] -struct FlatStructAccess<'a, 'de: 'a, E> { - iter: slice::IterMut<'a, Option<(Content<'de>, Content<'de>)>>, - pending_content: Option<Content<'de>>, - fields: &'static [&'static str], - _marker: PhantomData<E>, -} - -#[cfg(any(feature = "std", feature = "alloc"))] -impl<'a, 'de, E> MapAccess<'de> for FlatStructAccess<'a, 'de, E> -where - E: Error, -{ - type Error = E; - - fn next_key_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error> - where - T: DeserializeSeed<'de>, - { - for entry in self.iter.by_ref() { - if let Some((key, content)) = flat_map_take_entry(entry, self.fields) { - self.pending_content = Some(content); - return seed.deserialize(ContentDeserializer::new(key)).map(Some); - } - } - Ok(None) - } - - fn next_value_seed<T>(&mut self, seed: T) -> Result<T::Value, Self::Error> - where - T: DeserializeSeed<'de>, - { - match self.pending_content.take() { - Some(value) => seed.deserialize(ContentDeserializer::new(value)), - None => Err(Error::custom("value is missing")), - } - } -} - -/// Claims one key-value pair from a FlatMapDeserializer's field buffer if the -/// field name matches any of the recognized ones. -#[cfg(any(feature = "std", feature = "alloc"))] -fn flat_map_take_entry<'de>( - entry: &mut Option<(Content<'de>, Content<'de>)>, - recognized: &[&str], -) -> Option<(Content<'de>, Content<'de>)> { - // Entries in the FlatMapDeserializer buffer are nulled out as they get - // claimed for deserialization. We only use an entry if it is still present - // and if the field is one recognized by the current data structure. - let is_recognized = match entry { - None => false, - Some((k, _v)) => k.as_str().map_or(false, |name| recognized.contains(&name)), - }; - - if is_recognized { - entry.take() - } else { - None - } -} - -pub struct AdjacentlyTaggedEnumVariantSeed<F> { - pub enum_name: &'static str, - pub variants: &'static [&'static str], - pub fields_enum: PhantomData<F>, -} - -pub struct AdjacentlyTaggedEnumVariantVisitor<F> { - enum_name: &'static str, - fields_enum: PhantomData<F>, -} - -impl<'de, F> Visitor<'de> for AdjacentlyTaggedEnumVariantVisitor<F> -where - F: Deserialize<'de>, -{ - type Value = F; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - write!(formatter, "variant of enum {}", self.enum_name) - } - - fn visit_enum<A>(self, data: A) -> Result<Self::Value, A::Error> - where - A: EnumAccess<'de>, - { - let (variant, variant_access) = tri!(data.variant()); - tri!(variant_access.unit_variant()); - Ok(variant) - } -} - -impl<'de, F> DeserializeSeed<'de> for AdjacentlyTaggedEnumVariantSeed<F> -where - F: Deserialize<'de>, -{ - type Value = F; - - fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error> - where - D: Deserializer<'de>, - { - deserializer.deserialize_enum( - self.enum_name, - self.variants, - AdjacentlyTaggedEnumVariantVisitor { - enum_name: self.enum_name, - fields_enum: PhantomData, - }, - ) - } -} diff --git a/vendor/serde/src/private/doc.rs b/vendor/serde/src/private/doc.rs deleted file mode 100644 index 1b18fe6..0000000 --- a/vendor/serde/src/private/doc.rs +++ /dev/null @@ -1,159 +0,0 @@ -// Used only by Serde doc tests. Not public API. - -use crate::lib::*; - -use crate::ser; - -#[doc(hidden)] -#[derive(Debug)] -pub struct Error; - -impl ser::Error for Error { - fn custom<T>(_: T) -> Self - where - T: Display, - { - unimplemented!() - } -} - -#[cfg(feature = "std")] -impl error::Error for Error { - fn description(&self) -> &str { - unimplemented!() - } -} - -impl Display for Error { - fn fmt(&self, _: &mut fmt::Formatter) -> fmt::Result { - unimplemented!() - } -} - -#[doc(hidden)] -#[macro_export] -macro_rules! __private_serialize { - () => { - trait Serialize { - fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> - where - S: $crate::Serializer; - } - }; -} - -#[doc(hidden)] -#[macro_export(local_inner_macros)] -macro_rules! __serialize_unimplemented { - ($($func:ident)*) => { - $( - __serialize_unimplemented_helper!($func); - )* - }; -} - -#[doc(hidden)] -#[macro_export] -macro_rules! __serialize_unimplemented_method { - ($func:ident $(<$t:ident>)* ($($arg:ty),*) -> $ret:ident) => { - fn $func $(<$t: ?Sized + $crate::Serialize>)* (self $(, _: $arg)*) -> $crate::__private::Result<Self::$ret, Self::Error> { - unimplemented!() - } - }; -} - -#[doc(hidden)] -#[macro_export(local_inner_macros)] -macro_rules! __serialize_unimplemented_helper { - (bool) => { - __serialize_unimplemented_method!(serialize_bool(bool) -> Ok); - }; - (i8) => { - __serialize_unimplemented_method!(serialize_i8(i8) -> Ok); - }; - (i16) => { - __serialize_unimplemented_method!(serialize_i16(i16) -> Ok); - }; - (i32) => { - __serialize_unimplemented_method!(serialize_i32(i32) -> Ok); - }; - (i64) => { - __serialize_unimplemented_method!(serialize_i64(i64) -> Ok); - }; - (u8) => { - __serialize_unimplemented_method!(serialize_u8(u8) -> Ok); - }; - (u16) => { - __serialize_unimplemented_method!(serialize_u16(u16) -> Ok); - }; - (u32) => { - __serialize_unimplemented_method!(serialize_u32(u32) -> Ok); - }; - (u64) => { - __serialize_unimplemented_method!(serialize_u64(u64) -> Ok); - }; - (f32) => { - __serialize_unimplemented_method!(serialize_f32(f32) -> Ok); - }; - (f64) => { - __serialize_unimplemented_method!(serialize_f64(f64) -> Ok); - }; - (char) => { - __serialize_unimplemented_method!(serialize_char(char) -> Ok); - }; - (str) => { - __serialize_unimplemented_method!(serialize_str(&str) -> Ok); - }; - (bytes) => { - __serialize_unimplemented_method!(serialize_bytes(&[u8]) -> Ok); - }; - (none) => { - __serialize_unimplemented_method!(serialize_none() -> Ok); - }; - (some) => { - __serialize_unimplemented_method!(serialize_some<T>(&T) -> Ok); - }; - (unit) => { - __serialize_unimplemented_method!(serialize_unit() -> Ok); - }; - (unit_struct) => { - __serialize_unimplemented_method!(serialize_unit_struct(&str) -> Ok); - }; - (unit_variant) => { - __serialize_unimplemented_method!(serialize_unit_variant(&str, u32, &str) -> Ok); - }; - (newtype_struct) => { - __serialize_unimplemented_method!(serialize_newtype_struct<T>(&str, &T) -> Ok); - }; - (newtype_variant) => { - __serialize_unimplemented_method!(serialize_newtype_variant<T>(&str, u32, &str, &T) -> Ok); - }; - (seq) => { - type SerializeSeq = $crate::ser::Impossible<Self::Ok, Self::Error>; - __serialize_unimplemented_method!(serialize_seq(Option<usize>) -> SerializeSeq); - }; - (tuple) => { - type SerializeTuple = $crate::ser::Impossible<Self::Ok, Self::Error>; - __serialize_unimplemented_method!(serialize_tuple(usize) -> SerializeTuple); - }; - (tuple_struct) => { - type SerializeTupleStruct = $crate::ser::Impossible<Self::Ok, Self::Error>; - __serialize_unimplemented_method!(serialize_tuple_struct(&str, usize) -> SerializeTupleStruct); - }; - (tuple_variant) => { - type SerializeTupleVariant = $crate::ser::Impossible<Self::Ok, Self::Error>; - __serialize_unimplemented_method!(serialize_tuple_variant(&str, u32, &str, usize) -> SerializeTupleVariant); - }; - (map) => { - type SerializeMap = $crate::ser::Impossible<Self::Ok, Self::Error>; - __serialize_unimplemented_method!(serialize_map(Option<usize>) -> SerializeMap); - }; - (struct) => { - type SerializeStruct = $crate::ser::Impossible<Self::Ok, Self::Error>; - __serialize_unimplemented_method!(serialize_struct(&str, usize) -> SerializeStruct); - }; - (struct_variant) => { - type SerializeStructVariant = $crate::ser::Impossible<Self::Ok, Self::Error>; - __serialize_unimplemented_method!(serialize_struct_variant(&str, u32, &str, usize) -> SerializeStructVariant); - }; -} diff --git a/vendor/serde/src/private/mod.rs b/vendor/serde/src/private/mod.rs deleted file mode 100644 index 177f850..0000000 --- a/vendor/serde/src/private/mod.rs +++ /dev/null @@ -1,48 +0,0 @@ -#[cfg(not(no_serde_derive))] -pub mod de; -#[cfg(not(no_serde_derive))] -pub mod ser; - -// FIXME: #[cfg(doctest)] once https://github.com/rust-lang/rust/issues/67295 is fixed. -pub mod doc; - -pub use crate::lib::clone::Clone; -pub use crate::lib::convert::{From, Into}; -pub use crate::lib::default::Default; -pub use crate::lib::fmt::{self, Formatter}; -pub use crate::lib::marker::PhantomData; -pub use crate::lib::option::Option::{self, None, Some}; -pub use crate::lib::ptr; -pub use crate::lib::result::Result::{self, Err, Ok}; - -pub use self::string::from_utf8_lossy; - -#[cfg(any(feature = "alloc", feature = "std"))] -pub use crate::lib::{ToString, Vec}; - -#[cfg(not(no_core_try_from))] -pub use crate::lib::convert::TryFrom; - -mod string { - use crate::lib::*; - - #[cfg(any(feature = "std", feature = "alloc"))] - pub fn from_utf8_lossy(bytes: &[u8]) -> Cow<str> { - String::from_utf8_lossy(bytes) - } - - // The generated code calls this like: - // - // let value = &_serde::__private::from_utf8_lossy(bytes); - // Err(_serde::de::Error::unknown_variant(value, VARIANTS)) - // - // so it is okay for the return type to be different from the std case as long - // as the above works. - #[cfg(not(any(feature = "std", feature = "alloc")))] - pub fn from_utf8_lossy(bytes: &[u8]) -> &str { - // Three unicode replacement characters if it fails. They look like a - // white-on-black question mark. The user will recognize it as invalid - // UTF-8. - str::from_utf8(bytes).unwrap_or("\u{fffd}\u{fffd}\u{fffd}") - } -} diff --git a/vendor/serde/src/private/ser.rs b/vendor/serde/src/private/ser.rs deleted file mode 100644 index 50bcb25..0000000 --- a/vendor/serde/src/private/ser.rs +++ /dev/null @@ -1,1385 +0,0 @@ -use crate::lib::*; - -use crate::ser::{self, Impossible, Serialize, SerializeMap, SerializeStruct, Serializer}; - -#[cfg(any(feature = "std", feature = "alloc"))] -use self::content::{ - Content, ContentSerializer, SerializeStructVariantAsMapValue, SerializeTupleVariantAsMapValue, -}; - -/// Used to check that serde(getter) attributes return the expected type. -/// Not public API. -pub fn constrain<T: ?Sized>(t: &T) -> &T { - t -} - -/// Not public API. -pub fn serialize_tagged_newtype<S, T>( - serializer: S, - type_ident: &'static str, - variant_ident: &'static str, - tag: &'static str, - variant_name: &'static str, - value: &T, -) -> Result<S::Ok, S::Error> -where - S: Serializer, - T: Serialize, -{ - value.serialize(TaggedSerializer { - type_ident, - variant_ident, - tag, - variant_name, - delegate: serializer, - }) -} - -struct TaggedSerializer<S> { - type_ident: &'static str, - variant_ident: &'static str, - tag: &'static str, - variant_name: &'static str, - delegate: S, -} - -enum Unsupported { - Boolean, - Integer, - Float, - Char, - String, - ByteArray, - Optional, - #[cfg(any(feature = "std", feature = "alloc"))] - UnitStruct, - Sequence, - Tuple, - TupleStruct, - Enum, -} - -impl Display for Unsupported { - fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - match *self { - Unsupported::Boolean => formatter.write_str("a boolean"), - Unsupported::Integer => formatter.write_str("an integer"), - Unsupported::Float => formatter.write_str("a float"), - Unsupported::Char => formatter.write_str("a char"), - Unsupported::String => formatter.write_str("a string"), - Unsupported::ByteArray => formatter.write_str("a byte array"), - Unsupported::Optional => formatter.write_str("an optional"), - #[cfg(any(feature = "std", feature = "alloc"))] - Unsupported::UnitStruct => formatter.write_str("unit struct"), - Unsupported::Sequence => formatter.write_str("a sequence"), - Unsupported::Tuple => formatter.write_str("a tuple"), - Unsupported::TupleStruct => formatter.write_str("a tuple struct"), - Unsupported::Enum => formatter.write_str("an enum"), - } - } -} - -impl<S> TaggedSerializer<S> -where - S: Serializer, -{ - fn bad_type(self, what: Unsupported) -> S::Error { - ser::Error::custom(format_args!( - "cannot serialize tagged newtype variant {}::{} containing {}", - self.type_ident, self.variant_ident, what - )) - } -} - -impl<S> Serializer for TaggedSerializer<S> -where - S: Serializer, -{ - type Ok = S::Ok; - type Error = S::Error; - - type SerializeSeq = Impossible<S::Ok, S::Error>; - type SerializeTuple = Impossible<S::Ok, S::Error>; - type SerializeTupleStruct = Impossible<S::Ok, S::Error>; - type SerializeMap = S::SerializeMap; - type SerializeStruct = S::SerializeStruct; - - #[cfg(not(any(feature = "std", feature = "alloc")))] - type SerializeTupleVariant = Impossible<S::Ok, S::Error>; - #[cfg(any(feature = "std", feature = "alloc"))] - type SerializeTupleVariant = SerializeTupleVariantAsMapValue<S::SerializeMap>; - - #[cfg(not(any(feature = "std", feature = "alloc")))] - type SerializeStructVariant = Impossible<S::Ok, S::Error>; - #[cfg(any(feature = "std", feature = "alloc"))] - type SerializeStructVariant = SerializeStructVariantAsMapValue<S::SerializeMap>; - - fn serialize_bool(self, _: bool) -> Result<Self::Ok, Self::Error> { - Err(self.bad_type(Unsupported::Boolean)) - } - - fn serialize_i8(self, _: i8) -> Result<Self::Ok, Self::Error> { - Err(self.bad_type(Unsupported::Integer)) - } - - fn serialize_i16(self, _: i16) -> Result<Self::Ok, Self::Error> { - Err(self.bad_type(Unsupported::Integer)) - } - - fn serialize_i32(self, _: i32) -> Result<Self::Ok, Self::Error> { - Err(self.bad_type(Unsupported::Integer)) - } - - fn serialize_i64(self, _: i64) -> Result<Self::Ok, Self::Error> { - Err(self.bad_type(Unsupported::Integer)) - } - - fn serialize_u8(self, _: u8) -> Result<Self::Ok, Self::Error> { - Err(self.bad_type(Unsupported::Integer)) - } - - fn serialize_u16(self, _: u16) -> Result<Self::Ok, Self::Error> { - Err(self.bad_type(Unsupported::Integer)) - } - - fn serialize_u32(self, _: u32) -> Result<Self::Ok, Self::Error> { - Err(self.bad_type(Unsupported::Integer)) - } - - fn serialize_u64(self, _: u64) -> Result<Self::Ok, Self::Error> { - Err(self.bad_type(Unsupported::Integer)) - } - - fn serialize_f32(self, _: f32) -> Result<Self::Ok, Self::Error> { - Err(self.bad_type(Unsupported::Float)) - } - - fn serialize_f64(self, _: f64) -> Result<Self::Ok, Self::Error> { - Err(self.bad_type(Unsupported::Float)) - } - - fn serialize_char(self, _: char) -> Result<Self::Ok, Self::Error> { - Err(self.bad_type(Unsupported::Char)) - } - - fn serialize_str(self, _: &str) -> Result<Self::Ok, Self::Error> { - Err(self.bad_type(Unsupported::String)) - } - - fn serialize_bytes(self, _: &[u8]) -> Result<Self::Ok, Self::Error> { - Err(self.bad_type(Unsupported::ByteArray)) - } - - fn serialize_none(self) -> Result<Self::Ok, Self::Error> { - Err(self.bad_type(Unsupported::Optional)) - } - - fn serialize_some<T: ?Sized>(self, _: &T) -> Result<Self::Ok, Self::Error> - where - T: Serialize, - { - Err(self.bad_type(Unsupported::Optional)) - } - - fn serialize_unit(self) -> Result<Self::Ok, Self::Error> { - let mut map = tri!(self.delegate.serialize_map(Some(1))); - tri!(map.serialize_entry(self.tag, self.variant_name)); - map.end() - } - - fn serialize_unit_struct(self, _: &'static str) -> Result<Self::Ok, Self::Error> { - let mut map = tri!(self.delegate.serialize_map(Some(1))); - tri!(map.serialize_entry(self.tag, self.variant_name)); - map.end() - } - - fn serialize_unit_variant( - self, - _: &'static str, - _: u32, - inner_variant: &'static str, - ) -> Result<Self::Ok, Self::Error> { - let mut map = tri!(self.delegate.serialize_map(Some(2))); - tri!(map.serialize_entry(self.tag, self.variant_name)); - tri!(map.serialize_entry(inner_variant, &())); - map.end() - } - - fn serialize_newtype_struct<T: ?Sized>( - self, - _: &'static str, - value: &T, - ) -> Result<Self::Ok, Self::Error> - where - T: Serialize, - { - value.serialize(self) - } - - fn serialize_newtype_variant<T: ?Sized>( - self, - _: &'static str, - _: u32, - inner_variant: &'static str, - inner_value: &T, - ) -> Result<Self::Ok, Self::Error> - where - T: Serialize, - { - let mut map = tri!(self.delegate.serialize_map(Some(2))); - tri!(map.serialize_entry(self.tag, self.variant_name)); - tri!(map.serialize_entry(inner_variant, inner_value)); - map.end() - } - - fn serialize_seq(self, _: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> { - Err(self.bad_type(Unsupported::Sequence)) - } - - fn serialize_tuple(self, _: usize) -> Result<Self::SerializeTuple, Self::Error> { - Err(self.bad_type(Unsupported::Tuple)) - } - - fn serialize_tuple_struct( - self, - _: &'static str, - _: usize, - ) -> Result<Self::SerializeTupleStruct, Self::Error> { - Err(self.bad_type(Unsupported::TupleStruct)) - } - - #[cfg(not(any(feature = "std", feature = "alloc")))] - fn serialize_tuple_variant( - self, - _: &'static str, - _: u32, - _: &'static str, - _: usize, - ) -> Result<Self::SerializeTupleVariant, Self::Error> { - // Lack of push-based serialization means we need to buffer the content - // of the tuple variant, so it requires std. - Err(self.bad_type(Unsupported::Enum)) - } - - #[cfg(any(feature = "std", feature = "alloc"))] - fn serialize_tuple_variant( - self, - _: &'static str, - _: u32, - inner_variant: &'static str, - len: usize, - ) -> Result<Self::SerializeTupleVariant, Self::Error> { - let mut map = tri!(self.delegate.serialize_map(Some(2))); - tri!(map.serialize_entry(self.tag, self.variant_name)); - tri!(map.serialize_key(inner_variant)); - Ok(SerializeTupleVariantAsMapValue::new( - map, - inner_variant, - len, - )) - } - - fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> { - let mut map = tri!(self.delegate.serialize_map(len.map(|len| len + 1))); - tri!(map.serialize_entry(self.tag, self.variant_name)); - Ok(map) - } - - fn serialize_struct( - self, - name: &'static str, - len: usize, - ) -> Result<Self::SerializeStruct, Self::Error> { - let mut state = tri!(self.delegate.serialize_struct(name, len + 1)); - tri!(state.serialize_field(self.tag, self.variant_name)); - Ok(state) - } - - #[cfg(not(any(feature = "std", feature = "alloc")))] - fn serialize_struct_variant( - self, - _: &'static str, - _: u32, - _: &'static str, - _: usize, - ) -> Result<Self::SerializeStructVariant, Self::Error> { - // Lack of push-based serialization means we need to buffer the content - // of the struct variant, so it requires std. - Err(self.bad_type(Unsupported::Enum)) - } - - #[cfg(any(feature = "std", feature = "alloc"))] - fn serialize_struct_variant( - self, - _: &'static str, - _: u32, - inner_variant: &'static str, - len: usize, - ) -> Result<Self::SerializeStructVariant, Self::Error> { - let mut map = tri!(self.delegate.serialize_map(Some(2))); - tri!(map.serialize_entry(self.tag, self.variant_name)); - tri!(map.serialize_key(inner_variant)); - Ok(SerializeStructVariantAsMapValue::new( - map, - inner_variant, - len, - )) - } - - #[cfg(not(any(feature = "std", feature = "alloc")))] - fn collect_str<T: ?Sized>(self, _: &T) -> Result<Self::Ok, Self::Error> - where - T: Display, - { - Err(self.bad_type(Unsupported::String)) - } -} - -#[cfg(any(feature = "std", feature = "alloc"))] -mod content { - use crate::lib::*; - - use crate::ser::{self, Serialize, Serializer}; - - pub struct SerializeTupleVariantAsMapValue<M> { - map: M, - name: &'static str, - fields: Vec<Content>, - } - - impl<M> SerializeTupleVariantAsMapValue<M> { - pub fn new(map: M, name: &'static str, len: usize) -> Self { - SerializeTupleVariantAsMapValue { - map, - name, - fields: Vec::with_capacity(len), - } - } - } - - impl<M> ser::SerializeTupleVariant for SerializeTupleVariantAsMapValue<M> - where - M: ser::SerializeMap, - { - type Ok = M::Ok; - type Error = M::Error; - - fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), M::Error> - where - T: Serialize, - { - let value = tri!(value.serialize(ContentSerializer::<M::Error>::new())); - self.fields.push(value); - Ok(()) - } - - fn end(mut self) -> Result<M::Ok, M::Error> { - tri!(self - .map - .serialize_value(&Content::TupleStruct(self.name, self.fields))); - self.map.end() - } - } - - pub struct SerializeStructVariantAsMapValue<M> { - map: M, - name: &'static str, - fields: Vec<(&'static str, Content)>, - } - - impl<M> SerializeStructVariantAsMapValue<M> { - pub fn new(map: M, name: &'static str, len: usize) -> Self { - SerializeStructVariantAsMapValue { - map, - name, - fields: Vec::with_capacity(len), - } - } - } - - impl<M> ser::SerializeStructVariant for SerializeStructVariantAsMapValue<M> - where - M: ser::SerializeMap, - { - type Ok = M::Ok; - type Error = M::Error; - - fn serialize_field<T: ?Sized>( - &mut self, - key: &'static str, - value: &T, - ) -> Result<(), M::Error> - where - T: Serialize, - { - let value = tri!(value.serialize(ContentSerializer::<M::Error>::new())); - self.fields.push((key, value)); - Ok(()) - } - - fn end(mut self) -> Result<M::Ok, M::Error> { - tri!(self - .map - .serialize_value(&Content::Struct(self.name, self.fields))); - self.map.end() - } - } - - pub enum Content { - Bool(bool), - - U8(u8), - U16(u16), - U32(u32), - U64(u64), - - I8(i8), - I16(i16), - I32(i32), - I64(i64), - - F32(f32), - F64(f64), - - Char(char), - String(String), - Bytes(Vec<u8>), - - None, - Some(Box<Content>), - - Unit, - UnitStruct(&'static str), - UnitVariant(&'static str, u32, &'static str), - NewtypeStruct(&'static str, Box<Content>), - NewtypeVariant(&'static str, u32, &'static str, Box<Content>), - - Seq(Vec<Content>), - Tuple(Vec<Content>), - TupleStruct(&'static str, Vec<Content>), - TupleVariant(&'static str, u32, &'static str, Vec<Content>), - Map(Vec<(Content, Content)>), - Struct(&'static str, Vec<(&'static str, Content)>), - StructVariant( - &'static str, - u32, - &'static str, - Vec<(&'static str, Content)>, - ), - } - - impl Serialize for Content { - fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> - where - S: Serializer, - { - match *self { - Content::Bool(b) => serializer.serialize_bool(b), - Content::U8(u) => serializer.serialize_u8(u), - Content::U16(u) => serializer.serialize_u16(u), - Content::U32(u) => serializer.serialize_u32(u), - Content::U64(u) => serializer.serialize_u64(u), - Content::I8(i) => serializer.serialize_i8(i), - Content::I16(i) => serializer.serialize_i16(i), - Content::I32(i) => serializer.serialize_i32(i), - Content::I64(i) => serializer.serialize_i64(i), - Content::F32(f) => serializer.serialize_f32(f), - Content::F64(f) => serializer.serialize_f64(f), - Content::Char(c) => serializer.serialize_char(c), - Content::String(ref s) => serializer.serialize_str(s), - Content::Bytes(ref b) => serializer.serialize_bytes(b), - Content::None => serializer.serialize_none(), - Content::Some(ref c) => serializer.serialize_some(&**c), - Content::Unit => serializer.serialize_unit(), - Content::UnitStruct(n) => serializer.serialize_unit_struct(n), - Content::UnitVariant(n, i, v) => serializer.serialize_unit_variant(n, i, v), - Content::NewtypeStruct(n, ref c) => serializer.serialize_newtype_struct(n, &**c), - Content::NewtypeVariant(n, i, v, ref c) => { - serializer.serialize_newtype_variant(n, i, v, &**c) - } - Content::Seq(ref elements) => elements.serialize(serializer), - Content::Tuple(ref elements) => { - use crate::ser::SerializeTuple; - let mut tuple = tri!(serializer.serialize_tuple(elements.len())); - for e in elements { - tri!(tuple.serialize_element(e)); - } - tuple.end() - } - Content::TupleStruct(n, ref fields) => { - use crate::ser::SerializeTupleStruct; - let mut ts = tri!(serializer.serialize_tuple_struct(n, fields.len())); - for f in fields { - tri!(ts.serialize_field(f)); - } - ts.end() - } - Content::TupleVariant(n, i, v, ref fields) => { - use crate::ser::SerializeTupleVariant; - let mut tv = tri!(serializer.serialize_tuple_variant(n, i, v, fields.len())); - for f in fields { - tri!(tv.serialize_field(f)); - } - tv.end() - } - Content::Map(ref entries) => { - use crate::ser::SerializeMap; - let mut map = tri!(serializer.serialize_map(Some(entries.len()))); - for (k, v) in entries { - tri!(map.serialize_entry(k, v)); - } - map.end() - } - Content::Struct(n, ref fields) => { - use crate::ser::SerializeStruct; - let mut s = tri!(serializer.serialize_struct(n, fields.len())); - for &(k, ref v) in fields { - tri!(s.serialize_field(k, v)); - } - s.end() - } - Content::StructVariant(n, i, v, ref fields) => { - use crate::ser::SerializeStructVariant; - let mut sv = tri!(serializer.serialize_struct_variant(n, i, v, fields.len())); - for &(k, ref v) in fields { - tri!(sv.serialize_field(k, v)); - } - sv.end() - } - } - } - } - - pub struct ContentSerializer<E> { - error: PhantomData<E>, - } - - impl<E> ContentSerializer<E> { - pub fn new() -> Self { - ContentSerializer { error: PhantomData } - } - } - - impl<E> Serializer for ContentSerializer<E> - where - E: ser::Error, - { - type Ok = Content; - type Error = E; - - type SerializeSeq = SerializeSeq<E>; - type SerializeTuple = SerializeTuple<E>; - type SerializeTupleStruct = SerializeTupleStruct<E>; - type SerializeTupleVariant = SerializeTupleVariant<E>; - type SerializeMap = SerializeMap<E>; - type SerializeStruct = SerializeStruct<E>; - type SerializeStructVariant = SerializeStructVariant<E>; - - fn serialize_bool(self, v: bool) -> Result<Content, E> { - Ok(Content::Bool(v)) - } - - fn serialize_i8(self, v: i8) -> Result<Content, E> { - Ok(Content::I8(v)) - } - - fn serialize_i16(self, v: i16) -> Result<Content, E> { - Ok(Content::I16(v)) - } - - fn serialize_i32(self, v: i32) -> Result<Content, E> { - Ok(Content::I32(v)) - } - - fn serialize_i64(self, v: i64) -> Result<Content, E> { - Ok(Content::I64(v)) - } - - fn serialize_u8(self, v: u8) -> Result<Content, E> { - Ok(Content::U8(v)) - } - - fn serialize_u16(self, v: u16) -> Result<Content, E> { - Ok(Content::U16(v)) - } - - fn serialize_u32(self, v: u32) -> Result<Content, E> { - Ok(Content::U32(v)) - } - - fn serialize_u64(self, v: u64) -> Result<Content, E> { - Ok(Content::U64(v)) - } - - fn serialize_f32(self, v: f32) -> Result<Content, E> { - Ok(Content::F32(v)) - } - - fn serialize_f64(self, v: f64) -> Result<Content, E> { - Ok(Content::F64(v)) - } - - fn serialize_char(self, v: char) -> Result<Content, E> { - Ok(Content::Char(v)) - } - - fn serialize_str(self, value: &str) -> Result<Content, E> { - Ok(Content::String(value.to_owned())) - } - - fn serialize_bytes(self, value: &[u8]) -> Result<Content, E> { - Ok(Content::Bytes(value.to_owned())) - } - - fn serialize_none(self) -> Result<Content, E> { - Ok(Content::None) - } - - fn serialize_some<T: ?Sized>(self, value: &T) -> Result<Content, E> - where - T: Serialize, - { - Ok(Content::Some(Box::new(tri!(value.serialize(self))))) - } - - fn serialize_unit(self) -> Result<Content, E> { - Ok(Content::Unit) - } - - fn serialize_unit_struct(self, name: &'static str) -> Result<Content, E> { - Ok(Content::UnitStruct(name)) - } - - fn serialize_unit_variant( - self, - name: &'static str, - variant_index: u32, - variant: &'static str, - ) -> Result<Content, E> { - Ok(Content::UnitVariant(name, variant_index, variant)) - } - - fn serialize_newtype_struct<T: ?Sized>( - self, - name: &'static str, - value: &T, - ) -> Result<Content, E> - where - T: Serialize, - { - Ok(Content::NewtypeStruct( - name, - Box::new(tri!(value.serialize(self))), - )) - } - - fn serialize_newtype_variant<T: ?Sized>( - self, - name: &'static str, - variant_index: u32, - variant: &'static str, - value: &T, - ) -> Result<Content, E> - where - T: Serialize, - { - Ok(Content::NewtypeVariant( - name, - variant_index, - variant, - Box::new(tri!(value.serialize(self))), - )) - } - - fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, E> { - Ok(SerializeSeq { - elements: Vec::with_capacity(len.unwrap_or(0)), - error: PhantomData, - }) - } - - fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, E> { - Ok(SerializeTuple { - elements: Vec::with_capacity(len), - error: PhantomData, - }) - } - - fn serialize_tuple_struct( - self, - name: &'static str, - len: usize, - ) -> Result<Self::SerializeTupleStruct, E> { - Ok(SerializeTupleStruct { - name, - fields: Vec::with_capacity(len), - error: PhantomData, - }) - } - - fn serialize_tuple_variant( - self, - name: &'static str, - variant_index: u32, - variant: &'static str, - len: usize, - ) -> Result<Self::SerializeTupleVariant, E> { - Ok(SerializeTupleVariant { - name, - variant_index, - variant, - fields: Vec::with_capacity(len), - error: PhantomData, - }) - } - - fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, E> { - Ok(SerializeMap { - entries: Vec::with_capacity(len.unwrap_or(0)), - key: None, - error: PhantomData, - }) - } - - fn serialize_struct( - self, - name: &'static str, - len: usize, - ) -> Result<Self::SerializeStruct, E> { - Ok(SerializeStruct { - name, - fields: Vec::with_capacity(len), - error: PhantomData, - }) - } - - fn serialize_struct_variant( - self, - name: &'static str, - variant_index: u32, - variant: &'static str, - len: usize, - ) -> Result<Self::SerializeStructVariant, E> { - Ok(SerializeStructVariant { - name, - variant_index, - variant, - fields: Vec::with_capacity(len), - error: PhantomData, - }) - } - } - - pub struct SerializeSeq<E> { - elements: Vec<Content>, - error: PhantomData<E>, - } - - impl<E> ser::SerializeSeq for SerializeSeq<E> - where - E: ser::Error, - { - type Ok = Content; - type Error = E; - - fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), E> - where - T: Serialize, - { - let value = tri!(value.serialize(ContentSerializer::<E>::new())); - self.elements.push(value); - Ok(()) - } - - fn end(self) -> Result<Content, E> { - Ok(Content::Seq(self.elements)) - } - } - - pub struct SerializeTuple<E> { - elements: Vec<Content>, - error: PhantomData<E>, - } - - impl<E> ser::SerializeTuple for SerializeTuple<E> - where - E: ser::Error, - { - type Ok = Content; - type Error = E; - - fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), E> - where - T: Serialize, - { - let value = tri!(value.serialize(ContentSerializer::<E>::new())); - self.elements.push(value); - Ok(()) - } - - fn end(self) -> Result<Content, E> { - Ok(Content::Tuple(self.elements)) - } - } - - pub struct SerializeTupleStruct<E> { - name: &'static str, - fields: Vec<Content>, - error: PhantomData<E>, - } - - impl<E> ser::SerializeTupleStruct for SerializeTupleStruct<E> - where - E: ser::Error, - { - type Ok = Content; - type Error = E; - - fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), E> - where - T: Serialize, - { - let value = tri!(value.serialize(ContentSerializer::<E>::new())); - self.fields.push(value); - Ok(()) - } - - fn end(self) -> Result<Content, E> { - Ok(Content::TupleStruct(self.name, self.fields)) - } - } - - pub struct SerializeTupleVariant<E> { - name: &'static str, - variant_index: u32, - variant: &'static str, - fields: Vec<Content>, - error: PhantomData<E>, - } - - impl<E> ser::SerializeTupleVariant for SerializeTupleVariant<E> - where - E: ser::Error, - { - type Ok = Content; - type Error = E; - - fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), E> - where - T: Serialize, - { - let value = tri!(value.serialize(ContentSerializer::<E>::new())); - self.fields.push(value); - Ok(()) - } - - fn end(self) -> Result<Content, E> { - Ok(Content::TupleVariant( - self.name, - self.variant_index, - self.variant, - self.fields, - )) - } - } - - pub struct SerializeMap<E> { - entries: Vec<(Content, Content)>, - key: Option<Content>, - error: PhantomData<E>, - } - - impl<E> ser::SerializeMap for SerializeMap<E> - where - E: ser::Error, - { - type Ok = Content; - type Error = E; - - fn serialize_key<T: ?Sized>(&mut self, key: &T) -> Result<(), E> - where - T: Serialize, - { - let key = tri!(key.serialize(ContentSerializer::<E>::new())); - self.key = Some(key); - Ok(()) - } - - fn serialize_value<T: ?Sized>(&mut self, value: &T) -> Result<(), E> - where - T: Serialize, - { - let key = self - .key - .take() - .expect("serialize_value called before serialize_key"); - let value = tri!(value.serialize(ContentSerializer::<E>::new())); - self.entries.push((key, value)); - Ok(()) - } - - fn end(self) -> Result<Content, E> { - Ok(Content::Map(self.entries)) - } - - fn serialize_entry<K: ?Sized, V: ?Sized>(&mut self, key: &K, value: &V) -> Result<(), E> - where - K: Serialize, - V: Serialize, - { - let key = tri!(key.serialize(ContentSerializer::<E>::new())); - let value = tri!(value.serialize(ContentSerializer::<E>::new())); - self.entries.push((key, value)); - Ok(()) - } - } - - pub struct SerializeStruct<E> { - name: &'static str, - fields: Vec<(&'static str, Content)>, - error: PhantomData<E>, - } - - impl<E> ser::SerializeStruct for SerializeStruct<E> - where - E: ser::Error, - { - type Ok = Content; - type Error = E; - - fn serialize_field<T: ?Sized>(&mut self, key: &'static str, value: &T) -> Result<(), E> - where - T: Serialize, - { - let value = tri!(value.serialize(ContentSerializer::<E>::new())); - self.fields.push((key, value)); - Ok(()) - } - - fn end(self) -> Result<Content, E> { - Ok(Content::Struct(self.name, self.fields)) - } - } - - pub struct SerializeStructVariant<E> { - name: &'static str, - variant_index: u32, - variant: &'static str, - fields: Vec<(&'static str, Content)>, - error: PhantomData<E>, - } - - impl<E> ser::SerializeStructVariant for SerializeStructVariant<E> - where - E: ser::Error, - { - type Ok = Content; - type Error = E; - - fn serialize_field<T: ?Sized>(&mut self, key: &'static str, value: &T) -> Result<(), E> - where - T: Serialize, - { - let value = tri!(value.serialize(ContentSerializer::<E>::new())); - self.fields.push((key, value)); - Ok(()) - } - - fn end(self) -> Result<Content, E> { - Ok(Content::StructVariant( - self.name, - self.variant_index, - self.variant, - self.fields, - )) - } - } -} - -#[cfg(any(feature = "std", feature = "alloc"))] -pub struct FlatMapSerializer<'a, M: 'a>(pub &'a mut M); - -#[cfg(any(feature = "std", feature = "alloc"))] -impl<'a, M> FlatMapSerializer<'a, M> -where - M: SerializeMap + 'a, -{ - fn bad_type(what: Unsupported) -> M::Error { - ser::Error::custom(format_args!( - "can only flatten structs and maps (got {})", - what - )) - } -} - -#[cfg(any(feature = "std", feature = "alloc"))] -impl<'a, M> Serializer for FlatMapSerializer<'a, M> -where - M: SerializeMap + 'a, -{ - type Ok = (); - type Error = M::Error; - - type SerializeSeq = Impossible<Self::Ok, M::Error>; - type SerializeTuple = Impossible<Self::Ok, M::Error>; - type SerializeTupleStruct = Impossible<Self::Ok, M::Error>; - type SerializeMap = FlatMapSerializeMap<'a, M>; - type SerializeStruct = FlatMapSerializeStruct<'a, M>; - type SerializeTupleVariant = FlatMapSerializeTupleVariantAsMapValue<'a, M>; - type SerializeStructVariant = FlatMapSerializeStructVariantAsMapValue<'a, M>; - - fn serialize_bool(self, _: bool) -> Result<Self::Ok, Self::Error> { - Err(Self::bad_type(Unsupported::Boolean)) - } - - fn serialize_i8(self, _: i8) -> Result<Self::Ok, Self::Error> { - Err(Self::bad_type(Unsupported::Integer)) - } - - fn serialize_i16(self, _: i16) -> Result<Self::Ok, Self::Error> { - Err(Self::bad_type(Unsupported::Integer)) - } - - fn serialize_i32(self, _: i32) -> Result<Self::Ok, Self::Error> { - Err(Self::bad_type(Unsupported::Integer)) - } - - fn serialize_i64(self, _: i64) -> Result<Self::Ok, Self::Error> { - Err(Self::bad_type(Unsupported::Integer)) - } - - fn serialize_u8(self, _: u8) -> Result<Self::Ok, Self::Error> { - Err(Self::bad_type(Unsupported::Integer)) - } - - fn serialize_u16(self, _: u16) -> Result<Self::Ok, Self::Error> { - Err(Self::bad_type(Unsupported::Integer)) - } - - fn serialize_u32(self, _: u32) -> Result<Self::Ok, Self::Error> { - Err(Self::bad_type(Unsupported::Integer)) - } - - fn serialize_u64(self, _: u64) -> Result<Self::Ok, Self::Error> { - Err(Self::bad_type(Unsupported::Integer)) - } - - fn serialize_f32(self, _: f32) -> Result<Self::Ok, Self::Error> { - Err(Self::bad_type(Unsupported::Float)) - } - - fn serialize_f64(self, _: f64) -> Result<Self::Ok, Self::Error> { - Err(Self::bad_type(Unsupported::Float)) - } - - fn serialize_char(self, _: char) -> Result<Self::Ok, Self::Error> { - Err(Self::bad_type(Unsupported::Char)) - } - - fn serialize_str(self, _: &str) -> Result<Self::Ok, Self::Error> { - Err(Self::bad_type(Unsupported::String)) - } - - fn serialize_bytes(self, _: &[u8]) -> Result<Self::Ok, Self::Error> { - Err(Self::bad_type(Unsupported::ByteArray)) - } - - fn serialize_none(self) -> Result<Self::Ok, Self::Error> { - Ok(()) - } - - fn serialize_some<T: ?Sized>(self, value: &T) -> Result<Self::Ok, Self::Error> - where - T: Serialize, - { - value.serialize(self) - } - - fn serialize_unit(self) -> Result<Self::Ok, Self::Error> { - Ok(()) - } - - fn serialize_unit_struct(self, _: &'static str) -> Result<Self::Ok, Self::Error> { - Err(Self::bad_type(Unsupported::UnitStruct)) - } - - fn serialize_unit_variant( - self, - _: &'static str, - _: u32, - _: &'static str, - ) -> Result<Self::Ok, Self::Error> { - Err(Self::bad_type(Unsupported::Enum)) - } - - fn serialize_newtype_struct<T: ?Sized>( - self, - _: &'static str, - value: &T, - ) -> Result<Self::Ok, Self::Error> - where - T: Serialize, - { - value.serialize(self) - } - - fn serialize_newtype_variant<T: ?Sized>( - self, - _: &'static str, - _: u32, - variant: &'static str, - value: &T, - ) -> Result<Self::Ok, Self::Error> - where - T: Serialize, - { - tri!(self.0.serialize_key(variant)); - self.0.serialize_value(value) - } - - fn serialize_seq(self, _: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> { - Err(Self::bad_type(Unsupported::Sequence)) - } - - fn serialize_tuple(self, _: usize) -> Result<Self::SerializeTuple, Self::Error> { - Err(Self::bad_type(Unsupported::Tuple)) - } - - fn serialize_tuple_struct( - self, - _: &'static str, - _: usize, - ) -> Result<Self::SerializeTupleStruct, Self::Error> { - Err(Self::bad_type(Unsupported::TupleStruct)) - } - - fn serialize_tuple_variant( - self, - _: &'static str, - _: u32, - variant: &'static str, - _: usize, - ) -> Result<Self::SerializeTupleVariant, Self::Error> { - tri!(self.0.serialize_key(variant)); - Ok(FlatMapSerializeTupleVariantAsMapValue::new(self.0)) - } - - fn serialize_map(self, _: Option<usize>) -> Result<Self::SerializeMap, Self::Error> { - Ok(FlatMapSerializeMap(self.0)) - } - - fn serialize_struct( - self, - _: &'static str, - _: usize, - ) -> Result<Self::SerializeStruct, Self::Error> { - Ok(FlatMapSerializeStruct(self.0)) - } - - fn serialize_struct_variant( - self, - _: &'static str, - _: u32, - inner_variant: &'static str, - _: usize, - ) -> Result<Self::SerializeStructVariant, Self::Error> { - tri!(self.0.serialize_key(inner_variant)); - Ok(FlatMapSerializeStructVariantAsMapValue::new( - self.0, - inner_variant, - )) - } -} - -#[cfg(any(feature = "std", feature = "alloc"))] -pub struct FlatMapSerializeMap<'a, M: 'a>(&'a mut M); - -#[cfg(any(feature = "std", feature = "alloc"))] -impl<'a, M> ser::SerializeMap for FlatMapSerializeMap<'a, M> -where - M: SerializeMap + 'a, -{ - type Ok = (); - type Error = M::Error; - - fn serialize_key<T: ?Sized>(&mut self, key: &T) -> Result<(), Self::Error> - where - T: Serialize, - { - self.0.serialize_key(key) - } - - fn serialize_value<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error> - where - T: Serialize, - { - self.0.serialize_value(value) - } - - fn serialize_entry<K: ?Sized, V: ?Sized>( - &mut self, - key: &K, - value: &V, - ) -> Result<(), Self::Error> - where - K: Serialize, - V: Serialize, - { - self.0.serialize_entry(key, value) - } - - fn end(self) -> Result<(), Self::Error> { - Ok(()) - } -} - -#[cfg(any(feature = "std", feature = "alloc"))] -pub struct FlatMapSerializeStruct<'a, M: 'a>(&'a mut M); - -#[cfg(any(feature = "std", feature = "alloc"))] -impl<'a, M> ser::SerializeStruct for FlatMapSerializeStruct<'a, M> -where - M: SerializeMap + 'a, -{ - type Ok = (); - type Error = M::Error; - - fn serialize_field<T: ?Sized>( - &mut self, - key: &'static str, - value: &T, - ) -> Result<(), Self::Error> - where - T: Serialize, - { - self.0.serialize_entry(key, value) - } - - fn end(self) -> Result<(), Self::Error> { - Ok(()) - } -} - -//////////////////////////////////////////////////////////////////////////////////////////////////// - -#[cfg(any(feature = "std", feature = "alloc"))] -pub struct FlatMapSerializeTupleVariantAsMapValue<'a, M: 'a> { - map: &'a mut M, - fields: Vec<Content>, -} - -#[cfg(any(feature = "std", feature = "alloc"))] -impl<'a, M> FlatMapSerializeTupleVariantAsMapValue<'a, M> -where - M: SerializeMap + 'a, -{ - fn new(map: &'a mut M) -> Self { - FlatMapSerializeTupleVariantAsMapValue { - map, - fields: Vec::new(), - } - } -} - -#[cfg(any(feature = "std", feature = "alloc"))] -impl<'a, M> ser::SerializeTupleVariant for FlatMapSerializeTupleVariantAsMapValue<'a, M> -where - M: SerializeMap + 'a, -{ - type Ok = (); - type Error = M::Error; - - fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error> - where - T: Serialize, - { - let value = tri!(value.serialize(ContentSerializer::<M::Error>::new())); - self.fields.push(value); - Ok(()) - } - - fn end(self) -> Result<(), Self::Error> { - tri!(self.map.serialize_value(&Content::Seq(self.fields))); - Ok(()) - } -} - -//////////////////////////////////////////////////////////////////////////////////////////////////// - -#[cfg(any(feature = "std", feature = "alloc"))] -pub struct FlatMapSerializeStructVariantAsMapValue<'a, M: 'a> { - map: &'a mut M, - name: &'static str, - fields: Vec<(&'static str, Content)>, -} - -#[cfg(any(feature = "std", feature = "alloc"))] -impl<'a, M> FlatMapSerializeStructVariantAsMapValue<'a, M> -where - M: SerializeMap + 'a, -{ - fn new(map: &'a mut M, name: &'static str) -> FlatMapSerializeStructVariantAsMapValue<'a, M> { - FlatMapSerializeStructVariantAsMapValue { - map, - name, - fields: Vec::new(), - } - } -} - -#[cfg(any(feature = "std", feature = "alloc"))] -impl<'a, M> ser::SerializeStructVariant for FlatMapSerializeStructVariantAsMapValue<'a, M> -where - M: SerializeMap + 'a, -{ - type Ok = (); - type Error = M::Error; - - fn serialize_field<T: ?Sized>( - &mut self, - key: &'static str, - value: &T, - ) -> Result<(), Self::Error> - where - T: Serialize, - { - let value = tri!(value.serialize(ContentSerializer::<M::Error>::new())); - self.fields.push((key, value)); - Ok(()) - } - - fn end(self) -> Result<(), Self::Error> { - tri!(self - .map - .serialize_value(&Content::Struct(self.name, self.fields))); - Ok(()) - } -} - -pub struct AdjacentlyTaggedEnumVariant { - pub enum_name: &'static str, - pub variant_index: u32, - pub variant_name: &'static str, -} - -impl Serialize for AdjacentlyTaggedEnumVariant { - fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> - where - S: Serializer, - { - serializer.serialize_unit_variant(self.enum_name, self.variant_index, self.variant_name) - } -} - -// Error when Serialize for a non_exhaustive remote enum encounters a variant -// that is not recognized. -pub struct CannotSerializeVariant<T>(pub T); - -impl<T> Display for CannotSerializeVariant<T> -where - T: Debug, -{ - fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - write!(formatter, "enum variant cannot be serialized: {:?}", self.0) - } -} |