blob: d0bdc7c4f6d8b302cda7605330c4735415ebd49c [file] [log] [blame]
//! Customizations to use with Serde's `#[serde(with = …)]` attribute.
/// Serialize/deserialize an enum using a YAML map containing one entry in which
/// the key identifies the variant name.
///
/// # Example
///
/// ```
/// # use serde_derive::{Deserialize, Serialize};
/// use serde::{Deserialize, Serialize};
///
/// #[derive(Serialize, Deserialize, PartialEq, Debug)]
/// enum Enum {
/// Unit,
/// Newtype(usize),
/// Tuple(usize, usize),
/// Struct { value: usize },
/// }
///
/// #[derive(Serialize, Deserialize, PartialEq, Debug)]
/// struct Struct {
/// #[serde(with = "serde_yaml::with::singleton_map")]
/// w: Enum,
/// #[serde(with = "serde_yaml::with::singleton_map")]
/// x: Enum,
/// #[serde(with = "serde_yaml::with::singleton_map")]
/// y: Enum,
/// #[serde(with = "serde_yaml::with::singleton_map")]
/// z: Enum,
/// }
///
/// fn main() {
/// let object = Struct {
/// w: Enum::Unit,
/// x: Enum::Newtype(1),
/// y: Enum::Tuple(1, 1),
/// z: Enum::Struct { value: 1 },
/// };
///
/// let yaml = serde_yaml::to_string(&object).unwrap();
/// print!("{}", yaml);
///
/// let deserialized: Struct = serde_yaml::from_str(&yaml).unwrap();
/// assert_eq!(object, deserialized);
/// }
/// ```
///
/// The representation using `singleton_map` on all the fields is:
///
/// ```yaml
/// w: Unit
/// x:
/// Newtype: 1
/// y:
/// Tuple:
/// - 1
/// - 1
/// z:
/// Struct:
/// value: 1
/// ```
///
/// Without `singleton_map`, the default behavior would have been to serialize
/// as:
///
/// ```yaml
/// w: Unit
/// x: !Newtype 1
/// y: !Tuple
/// - 1
/// - 1
/// z: !Struct
/// value: 1
/// ```
pub mod singleton_map {
use crate::value::{Mapping, Sequence, Value};
use serde::de::{
self, Deserialize, DeserializeSeed, Deserializer, EnumAccess, IgnoredAny, MapAccess,
Unexpected, VariantAccess, Visitor,
};
use serde::ser::{
self, Serialize, SerializeMap, SerializeStructVariant, SerializeTupleVariant, Serializer,
};
use std::fmt::{self, Display};
#[allow(missing_docs)]
pub fn serialize<T, S>(value: &T, serializer: S) -> Result<S::Ok, S::Error>
where
T: Serialize,
S: Serializer,
{
value.serialize(SingletonMap {
delegate: serializer,
})
}
#[allow(missing_docs)]
pub fn deserialize<'de, T, D>(deserializer: D) -> Result<T, D::Error>
where
T: Deserialize<'de>,
D: Deserializer<'de>,
{
T::deserialize(SingletonMap {
delegate: deserializer,
})
}
struct SingletonMap<D> {
delegate: D,
}
impl<D> Serialize for SingletonMap<D>
where
D: Serialize,
{
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
self.delegate.serialize(SingletonMap {
delegate: serializer,
})
}
}
impl<D> Serializer for SingletonMap<D>
where
D: Serializer,
{
type Ok = D::Ok;
type Error = D::Error;
type SerializeSeq = D::SerializeSeq;
type SerializeTuple = D::SerializeTuple;
type SerializeTupleStruct = D::SerializeTupleStruct;
type SerializeTupleVariant = SerializeTupleVariantAsSingletonMap<D::SerializeMap>;
type SerializeMap = D::SerializeMap;
type SerializeStruct = D::SerializeStruct;
type SerializeStructVariant = SerializeStructVariantAsSingletonMap<D::SerializeMap>;
fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> {
self.delegate.serialize_bool(v)
}
fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> {
self.delegate.serialize_i8(v)
}
fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error> {
self.delegate.serialize_i16(v)
}
fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error> {
self.delegate.serialize_i32(v)
}
fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error> {
self.delegate.serialize_i64(v)
}
fn serialize_i128(self, v: i128) -> Result<Self::Ok, Self::Error> {
self.delegate.serialize_i128(v)
}
fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
self.delegate.serialize_u8(v)
}
fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> {
self.delegate.serialize_u16(v)
}
fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> {
self.delegate.serialize_u32(v)
}
fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error> {
self.delegate.serialize_u64(v)
}
fn serialize_u128(self, v: u128) -> Result<Self::Ok, Self::Error> {
self.delegate.serialize_u128(v)
}
fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error> {
self.delegate.serialize_f32(v)
}
fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error> {
self.delegate.serialize_f64(v)
}
fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error> {
self.delegate.serialize_char(v)
}
fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> {
self.delegate.serialize_str(v)
}
fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error> {
self.delegate.serialize_bytes(v)
}
fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
self.delegate.serialize_unit()
}
fn serialize_unit_struct(self, name: &'static str) -> Result<Self::Ok, Self::Error> {
self.delegate.serialize_unit_struct(name)
}
fn serialize_unit_variant(
self,
name: &'static str,
variant_index: u32,
variant: &'static str,
) -> Result<Self::Ok, Self::Error> {
self.delegate
.serialize_unit_variant(name, variant_index, variant)
}
fn serialize_newtype_struct<T>(
self,
name: &'static str,
value: &T,
) -> Result<Self::Ok, Self::Error>
where
T: ?Sized + Serialize,
{
self.delegate.serialize_newtype_struct(name, value)
}
fn serialize_newtype_variant<T>(
self,
_name: &'static str,
_variant_index: u32,
variant: &'static str,
value: &T,
) -> Result<Self::Ok, Self::Error>
where
T: ?Sized + Serialize,
{
let mut map = self.delegate.serialize_map(Some(1))?;
map.serialize_entry(variant, value)?;
map.end()
}
fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
self.delegate.serialize_none()
}
fn serialize_some<V>(self, value: &V) -> Result<Self::Ok, Self::Error>
where
V: ?Sized + Serialize,
{
self.delegate
.serialize_some(&SingletonMap { delegate: value })
}
fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
self.delegate.serialize_seq(len)
}
fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Self::Error> {
self.delegate.serialize_tuple(len)
}
fn serialize_tuple_struct(
self,
name: &'static str,
len: usize,
) -> Result<Self::SerializeTupleStruct, Self::Error> {
self.delegate.serialize_tuple_struct(name, len)
}
fn serialize_tuple_variant(
self,
_name: &'static str,
_variant_index: u32,
variant: &'static str,
len: usize,
) -> Result<Self::SerializeTupleVariant, Self::Error> {
let mut map = self.delegate.serialize_map(Some(1))?;
map.serialize_key(variant)?;
let sequence = Sequence::with_capacity(len);
Ok(SerializeTupleVariantAsSingletonMap { map, sequence })
}
fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
self.delegate.serialize_map(len)
}
fn serialize_struct(
self,
name: &'static str,
len: usize,
) -> Result<Self::SerializeStruct, Self::Error> {
self.delegate.serialize_struct(name, len)
}
fn serialize_struct_variant(
self,
_name: &'static str,
_variant_index: u32,
variant: &'static str,
len: usize,
) -> Result<Self::SerializeStructVariant, Self::Error> {
let mut map = self.delegate.serialize_map(Some(1))?;
map.serialize_key(variant)?;
let mapping = Mapping::with_capacity(len);
Ok(SerializeStructVariantAsSingletonMap { map, mapping })
}
fn collect_str<T>(self, value: &T) -> Result<Self::Ok, Self::Error>
where
T: ?Sized + Display,
{
self.delegate.collect_str(value)
}
fn is_human_readable(&self) -> bool {
self.delegate.is_human_readable()
}
}
struct SerializeTupleVariantAsSingletonMap<M> {
map: M,
sequence: Sequence,
}
impl<M> SerializeTupleVariant for SerializeTupleVariantAsSingletonMap<M>
where
M: SerializeMap,
{
type Ok = M::Ok;
type Error = M::Error;
fn serialize_field<T>(&mut self, field: &T) -> Result<(), Self::Error>
where
T: ?Sized + Serialize,
{
let value = field
.serialize(crate::value::Serializer)
.map_err(ser::Error::custom)?;
self.sequence.push(value);
Ok(())
}
fn end(mut self) -> Result<Self::Ok, Self::Error> {
self.map.serialize_value(&self.sequence)?;
self.map.end()
}
}
struct SerializeStructVariantAsSingletonMap<M> {
map: M,
mapping: Mapping,
}
impl<M> SerializeStructVariant for SerializeStructVariantAsSingletonMap<M>
where
M: SerializeMap,
{
type Ok = M::Ok;
type Error = M::Error;
fn serialize_field<T>(&mut self, name: &'static str, field: &T) -> Result<(), Self::Error>
where
T: ?Sized + Serialize,
{
let value = field
.serialize(crate::value::Serializer)
.map_err(ser::Error::custom)?;
self.mapping.insert(Value::String(name.to_owned()), value);
Ok(())
}
fn end(mut self) -> Result<Self::Ok, Self::Error> {
self.map.serialize_value(&self.mapping)?;
self.map.end()
}
}
impl<'de, D> Deserializer<'de> for SingletonMap<D>
where
D: Deserializer<'de>,
{
type Error = D::Error;
fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate.deserialize_any(visitor)
}
fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate.deserialize_bool(visitor)
}
fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate.deserialize_i8(visitor)
}
fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate.deserialize_i16(visitor)
}
fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate.deserialize_i32(visitor)
}
fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate.deserialize_i64(visitor)
}
fn deserialize_i128<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate.deserialize_i128(visitor)
}
fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate.deserialize_u8(visitor)
}
fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate.deserialize_u16(visitor)
}
fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate.deserialize_u32(visitor)
}
fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate.deserialize_u64(visitor)
}
fn deserialize_u128<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate.deserialize_u128(visitor)
}
fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate.deserialize_f32(visitor)
}
fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate.deserialize_f64(visitor)
}
fn deserialize_char<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate.deserialize_char(visitor)
}
fn deserialize_str<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate.deserialize_str(visitor)
}
fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate.deserialize_string(visitor)
}
fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate.deserialize_bytes(visitor)
}
fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate.deserialize_byte_buf(visitor)
}
fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate.deserialize_option(SingletonMapAsEnum {
name: "",
delegate: visitor,
})
}
fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate.deserialize_unit(visitor)
}
fn deserialize_unit_struct<V>(
self,
name: &'static str,
visitor: V,
) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate.deserialize_unit_struct(name, visitor)
}
fn deserialize_newtype_struct<V>(
self,
name: &'static str,
visitor: V,
) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate.deserialize_newtype_struct(name, visitor)
}
fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate.deserialize_seq(visitor)
}
fn deserialize_tuple<V>(self, len: usize, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate.deserialize_tuple(len, visitor)
}
fn deserialize_tuple_struct<V>(
self,
name: &'static str,
len: usize,
visitor: V,
) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate.deserialize_tuple_struct(name, len, visitor)
}
fn deserialize_map<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate.deserialize_map(visitor)
}
fn deserialize_struct<V>(
self,
name: &'static str,
fields: &'static [&'static str],
visitor: V,
) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate.deserialize_struct(name, fields, visitor)
}
fn deserialize_enum<V>(
self,
name: &'static str,
_variants: &'static [&'static str],
visitor: V,
) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate.deserialize_any(SingletonMapAsEnum {
name,
delegate: visitor,
})
}
fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate.deserialize_identifier(visitor)
}
fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate.deserialize_ignored_any(visitor)
}
fn is_human_readable(&self) -> bool {
self.delegate.is_human_readable()
}
}
struct SingletonMapAsEnum<D> {
name: &'static str,
delegate: D,
}
impl<'de, V> Visitor<'de> for SingletonMapAsEnum<V>
where
V: Visitor<'de>,
{
type Value = V::Value;
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
self.delegate.expecting(formatter)
}
fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
where
E: de::Error,
{
self.delegate.visit_enum(de::value::StrDeserializer::new(v))
}
fn visit_borrowed_str<E>(self, v: &'de str) -> Result<Self::Value, E>
where
E: de::Error,
{
self.delegate
.visit_enum(de::value::BorrowedStrDeserializer::new(v))
}
fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
where
E: de::Error,
{
self.delegate
.visit_enum(de::value::StringDeserializer::new(v))
}
fn visit_none<E>(self) -> Result<Self::Value, E>
where
E: de::Error,
{
self.delegate.visit_none()
}
fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
where
D: Deserializer<'de>,
{
self.delegate.visit_some(SingletonMap {
delegate: deserializer,
})
}
fn visit_unit<E>(self) -> Result<Self::Value, E>
where
E: de::Error,
{
self.delegate.visit_unit()
}
fn visit_map<A>(self, map: A) -> Result<Self::Value, A::Error>
where
A: MapAccess<'de>,
{
self.delegate.visit_enum(SingletonMapAsEnum {
name: self.name,
delegate: map,
})
}
}
impl<'de, D> EnumAccess<'de> for SingletonMapAsEnum<D>
where
D: MapAccess<'de>,
{
type Error = D::Error;
type Variant = Self;
fn variant_seed<V>(mut self, seed: V) -> Result<(V::Value, Self::Variant), Self::Error>
where
V: DeserializeSeed<'de>,
{
match self.delegate.next_key_seed(seed)? {
Some(value) => Ok((value, self)),
None => Err(de::Error::invalid_value(
Unexpected::Map,
&"map with a single key",
)),
}
}
}
impl<'de, D> VariantAccess<'de> for SingletonMapAsEnum<D>
where
D: MapAccess<'de>,
{
type Error = D::Error;
fn unit_variant(self) -> Result<(), Self::Error> {
Err(de::Error::invalid_type(Unexpected::Map, &"unit variant"))
}
fn newtype_variant_seed<T>(mut self, seed: T) -> Result<T::Value, Self::Error>
where
T: DeserializeSeed<'de>,
{
let value = self.delegate.next_value_seed(seed)?;
match self.delegate.next_key()? {
None => Ok(value),
Some(IgnoredAny) => Err(de::Error::invalid_value(
Unexpected::Map,
&"map with a single key",
)),
}
}
fn tuple_variant<V>(mut self, len: usize, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
let value = self
.delegate
.next_value_seed(TupleVariantSeed { len, visitor })?;
match self.delegate.next_key()? {
None => Ok(value),
Some(IgnoredAny) => Err(de::Error::invalid_value(
Unexpected::Map,
&"map with a single key",
)),
}
}
fn struct_variant<V>(
mut self,
fields: &'static [&'static str],
visitor: V,
) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
let value = self.delegate.next_value_seed(StructVariantSeed {
name: self.name,
fields,
visitor,
})?;
match self.delegate.next_key()? {
None => Ok(value),
Some(IgnoredAny) => Err(de::Error::invalid_value(
Unexpected::Map,
&"map with a single key",
)),
}
}
}
struct TupleVariantSeed<V> {
len: usize,
visitor: V,
}
impl<'de, V> DeserializeSeed<'de> for TupleVariantSeed<V>
where
V: Visitor<'de>,
{
type Value = V::Value;
fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
where
D: Deserializer<'de>,
{
deserializer.deserialize_tuple(self.len, self.visitor)
}
}
struct StructVariantSeed<V> {
name: &'static str,
fields: &'static [&'static str],
visitor: V,
}
impl<'de, V> DeserializeSeed<'de> for StructVariantSeed<V>
where
V: Visitor<'de>,
{
type Value = V::Value;
fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
where
D: Deserializer<'de>,
{
deserializer.deserialize_struct(self.name, self.fields, self.visitor)
}
}
}
/// Apply [`singleton_map`] to *all* enums contained within the data structure.
///
/// # Example
///
/// ```
/// # use serde_derive::{Deserialize, Serialize};
/// use serde::{Deserialize, Serialize};
///
/// #[derive(Serialize, Deserialize, PartialEq, Debug)]
/// enum Enum {
/// Int(i32),
/// }
///
/// #[derive(Serialize, Deserialize, PartialEq, Debug)]
/// struct Inner {
/// a: Enum,
/// bs: Vec<Enum>,
/// }
///
/// #[derive(Serialize, Deserialize, PartialEq, Debug)]
/// struct Outer {
/// tagged_style: Inner,
///
/// #[serde(with = "serde_yaml::with::singleton_map_recursive")]
/// singleton_map_style: Inner,
/// }
///
/// fn main() {
/// let object = Outer {
/// tagged_style: Inner {
/// a: Enum::Int(0),
/// bs: vec![Enum::Int(1)],
/// },
/// singleton_map_style: Inner {
/// a: Enum::Int(2),
/// bs: vec![Enum::Int(3)],
/// },
/// };
///
/// let yaml = serde_yaml::to_string(&object).unwrap();
/// print!("{}", yaml);
///
/// let deserialized: Outer = serde_yaml::from_str(&yaml).unwrap();
/// assert_eq!(object, deserialized);
/// }
/// ```
///
/// The serialized output is:
///
/// ```yaml
/// tagged_style:
/// a: !Int 0
/// bs:
/// - !Int 1
/// singleton_map_style:
/// a:
/// Int: 2
/// bs:
/// - Int: 3
/// ```
///
/// This module can also be used for the top-level serializer or deserializer
/// call, without `serde(with = …)`, as follows.
///
/// ```
/// # use serde_derive::{Deserialize, Serialize};
/// # use serde::{Deserialize, Serialize};
/// #
/// # #[derive(Serialize, Deserialize, PartialEq, Debug)]
/// # enum Enum {
/// # Int(i32),
/// # }
/// #
/// # #[derive(Serialize, Deserialize, PartialEq, Debug)]
/// # struct Inner {
/// # a: Enum,
/// # bs: Vec<Enum>,
/// # }
/// #
/// use std::io::{self, Write};
///
/// fn main() {
/// let object = Inner {
/// a: Enum::Int(0),
/// bs: vec![Enum::Int(1)],
/// };
///
/// let mut buf = Vec::new();
/// let mut serializer = serde_yaml::Serializer::new(&mut buf);
/// serde_yaml::with::singleton_map_recursive::serialize(&object, &mut serializer).unwrap();
/// io::stdout().write_all(&buf).unwrap();
///
/// let deserializer = serde_yaml::Deserializer::from_slice(&buf);
/// let deserialized: Inner = serde_yaml::with::singleton_map_recursive::deserialize(deserializer).unwrap();
/// assert_eq!(object, deserialized);
/// }
/// ```
pub mod singleton_map_recursive {
use crate::value::{Mapping, Sequence, Value};
use serde::de::{
self, Deserialize, DeserializeSeed, Deserializer, EnumAccess, IgnoredAny, MapAccess,
SeqAccess, Unexpected, VariantAccess, Visitor,
};
use serde::ser::{
self, Serialize, SerializeMap, SerializeSeq, SerializeStruct, SerializeStructVariant,
SerializeTuple, SerializeTupleStruct, SerializeTupleVariant, Serializer,
};
use std::fmt::{self, Display};
#[allow(missing_docs)]
pub fn serialize<T, S>(value: &T, serializer: S) -> Result<S::Ok, S::Error>
where
T: Serialize,
S: Serializer,
{
value.serialize(SingletonMapRecursive {
delegate: serializer,
})
}
#[allow(missing_docs)]
pub fn deserialize<'de, T, D>(deserializer: D) -> Result<T, D::Error>
where
T: Deserialize<'de>,
D: Deserializer<'de>,
{
T::deserialize(SingletonMapRecursive {
delegate: deserializer,
})
}
struct SingletonMapRecursive<D> {
delegate: D,
}
impl<D> Serialize for SingletonMapRecursive<D>
where
D: Serialize,
{
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
self.delegate.serialize(SingletonMapRecursive {
delegate: serializer,
})
}
}
impl<D> Serializer for SingletonMapRecursive<D>
where
D: Serializer,
{
type Ok = D::Ok;
type Error = D::Error;
type SerializeSeq = SingletonMapRecursive<D::SerializeSeq>;
type SerializeTuple = SingletonMapRecursive<D::SerializeTuple>;
type SerializeTupleStruct = SingletonMapRecursive<D::SerializeTupleStruct>;
type SerializeTupleVariant = SerializeTupleVariantAsSingletonMapRecursive<D::SerializeMap>;
type SerializeMap = SingletonMapRecursive<D::SerializeMap>;
type SerializeStruct = SingletonMapRecursive<D::SerializeStruct>;
type SerializeStructVariant =
SerializeStructVariantAsSingletonMapRecursive<D::SerializeMap>;
fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> {
self.delegate.serialize_bool(v)
}
fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> {
self.delegate.serialize_i8(v)
}
fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error> {
self.delegate.serialize_i16(v)
}
fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error> {
self.delegate.serialize_i32(v)
}
fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error> {
self.delegate.serialize_i64(v)
}
fn serialize_i128(self, v: i128) -> Result<Self::Ok, Self::Error> {
self.delegate.serialize_i128(v)
}
fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
self.delegate.serialize_u8(v)
}
fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> {
self.delegate.serialize_u16(v)
}
fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> {
self.delegate.serialize_u32(v)
}
fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error> {
self.delegate.serialize_u64(v)
}
fn serialize_u128(self, v: u128) -> Result<Self::Ok, Self::Error> {
self.delegate.serialize_u128(v)
}
fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error> {
self.delegate.serialize_f32(v)
}
fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error> {
self.delegate.serialize_f64(v)
}
fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error> {
self.delegate.serialize_char(v)
}
fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> {
self.delegate.serialize_str(v)
}
fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error> {
self.delegate.serialize_bytes(v)
}
fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
self.delegate.serialize_unit()
}
fn serialize_unit_struct(self, name: &'static str) -> Result<Self::Ok, Self::Error> {
self.delegate.serialize_unit_struct(name)
}
fn serialize_unit_variant(
self,
name: &'static str,
variant_index: u32,
variant: &'static str,
) -> Result<Self::Ok, Self::Error> {
self.delegate
.serialize_unit_variant(name, variant_index, variant)
}
fn serialize_newtype_struct<T>(
self,
name: &'static str,
value: &T,
) -> Result<Self::Ok, Self::Error>
where
T: ?Sized + Serialize,
{
self.delegate
.serialize_newtype_struct(name, &SingletonMapRecursive { delegate: value })
}
fn serialize_newtype_variant<T>(
self,
_name: &'static str,
_variant_index: u32,
variant: &'static str,
value: &T,
) -> Result<Self::Ok, Self::Error>
where
T: ?Sized + Serialize,
{
let mut map = self.delegate.serialize_map(Some(1))?;
map.serialize_entry(variant, &SingletonMapRecursive { delegate: value })?;
map.end()
}
fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
self.delegate.serialize_none()
}
fn serialize_some<V>(self, value: &V) -> Result<Self::Ok, Self::Error>
where
V: ?Sized + Serialize,
{
self.delegate
.serialize_some(&SingletonMapRecursive { delegate: value })
}
fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
Ok(SingletonMapRecursive {
delegate: self.delegate.serialize_seq(len)?,
})
}
fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Self::Error> {
Ok(SingletonMapRecursive {
delegate: self.delegate.serialize_tuple(len)?,
})
}
fn serialize_tuple_struct(
self,
name: &'static str,
len: usize,
) -> Result<Self::SerializeTupleStruct, Self::Error> {
Ok(SingletonMapRecursive {
delegate: self.delegate.serialize_tuple_struct(name, len)?,
})
}
fn serialize_tuple_variant(
self,
_name: &'static str,
_variant_index: u32,
variant: &'static str,
len: usize,
) -> Result<Self::SerializeTupleVariant, Self::Error> {
let mut map = self.delegate.serialize_map(Some(1))?;
map.serialize_key(variant)?;
let sequence = Sequence::with_capacity(len);
Ok(SerializeTupleVariantAsSingletonMapRecursive { map, sequence })
}
fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
Ok(SingletonMapRecursive {
delegate: self.delegate.serialize_map(len)?,
})
}
fn serialize_struct(
self,
name: &'static str,
len: usize,
) -> Result<Self::SerializeStruct, Self::Error> {
Ok(SingletonMapRecursive {
delegate: self.delegate.serialize_struct(name, len)?,
})
}
fn serialize_struct_variant(
self,
_name: &'static str,
_variant_index: u32,
variant: &'static str,
len: usize,
) -> Result<Self::SerializeStructVariant, Self::Error> {
let mut map = self.delegate.serialize_map(Some(1))?;
map.serialize_key(variant)?;
let mapping = Mapping::with_capacity(len);
Ok(SerializeStructVariantAsSingletonMapRecursive { map, mapping })
}
fn collect_str<T>(self, value: &T) -> Result<Self::Ok, Self::Error>
where
T: ?Sized + Display,
{
self.delegate.collect_str(value)
}
fn is_human_readable(&self) -> bool {
self.delegate.is_human_readable()
}
}
impl<D> SerializeSeq for SingletonMapRecursive<D>
where
D: SerializeSeq,
{
type Ok = D::Ok;
type Error = D::Error;
fn serialize_element<T>(&mut self, elem: &T) -> Result<(), Self::Error>
where
T: ?Sized + ser::Serialize,
{
self.delegate
.serialize_element(&SingletonMapRecursive { delegate: elem })
}
fn end(self) -> Result<Self::Ok, Self::Error> {
self.delegate.end()
}
}
impl<D> SerializeTuple for SingletonMapRecursive<D>
where
D: SerializeTuple,
{
type Ok = D::Ok;
type Error = D::Error;
fn serialize_element<T>(&mut self, elem: &T) -> Result<(), Self::Error>
where
T: ?Sized + ser::Serialize,
{
self.delegate
.serialize_element(&SingletonMapRecursive { delegate: elem })
}
fn end(self) -> Result<Self::Ok, Self::Error> {
self.delegate.end()
}
}
impl<D> SerializeTupleStruct for SingletonMapRecursive<D>
where
D: SerializeTupleStruct,
{
type Ok = D::Ok;
type Error = D::Error;
fn serialize_field<V>(&mut self, value: &V) -> Result<(), Self::Error>
where
V: ?Sized + ser::Serialize,
{
self.delegate
.serialize_field(&SingletonMapRecursive { delegate: value })
}
fn end(self) -> Result<Self::Ok, Self::Error> {
self.delegate.end()
}
}
struct SerializeTupleVariantAsSingletonMapRecursive<M> {
map: M,
sequence: Sequence,
}
impl<M> SerializeTupleVariant for SerializeTupleVariantAsSingletonMapRecursive<M>
where
M: SerializeMap,
{
type Ok = M::Ok;
type Error = M::Error;
fn serialize_field<T>(&mut self, field: &T) -> Result<(), Self::Error>
where
T: ?Sized + Serialize,
{
let value = field
.serialize(SingletonMapRecursive {
delegate: crate::value::Serializer,
})
.map_err(ser::Error::custom)?;
self.sequence.push(value);
Ok(())
}
fn end(mut self) -> Result<Self::Ok, Self::Error> {
self.map.serialize_value(&self.sequence)?;
self.map.end()
}
}
impl<D> SerializeMap for SingletonMapRecursive<D>
where
D: SerializeMap,
{
type Ok = D::Ok;
type Error = D::Error;
fn serialize_key<T>(&mut self, key: &T) -> Result<(), Self::Error>
where
T: ?Sized + ser::Serialize,
{
self.delegate
.serialize_key(&SingletonMapRecursive { delegate: key })
}
fn serialize_value<T>(&mut self, value: &T) -> Result<(), Self::Error>
where
T: ?Sized + ser::Serialize,
{
self.delegate
.serialize_value(&SingletonMapRecursive { delegate: value })
}
fn serialize_entry<K, V>(&mut self, key: &K, value: &V) -> Result<(), Self::Error>
where
K: ?Sized + ser::Serialize,
V: ?Sized + ser::Serialize,
{
self.delegate.serialize_entry(
&SingletonMapRecursive { delegate: key },
&SingletonMapRecursive { delegate: value },
)
}
fn end(self) -> Result<Self::Ok, Self::Error> {
self.delegate.end()
}
}
impl<D> SerializeStruct for SingletonMapRecursive<D>
where
D: SerializeStruct,
{
type Ok = D::Ok;
type Error = D::Error;
fn serialize_field<V>(&mut self, key: &'static str, value: &V) -> Result<(), Self::Error>
where
V: ?Sized + ser::Serialize,
{
self.delegate
.serialize_field(key, &SingletonMapRecursive { delegate: value })
}
fn end(self) -> Result<Self::Ok, Self::Error> {
self.delegate.end()
}
}
struct SerializeStructVariantAsSingletonMapRecursive<M> {
map: M,
mapping: Mapping,
}
impl<M> SerializeStructVariant for SerializeStructVariantAsSingletonMapRecursive<M>
where
M: SerializeMap,
{
type Ok = M::Ok;
type Error = M::Error;
fn serialize_field<T>(&mut self, name: &'static str, field: &T) -> Result<(), Self::Error>
where
T: ?Sized + Serialize,
{
let value = field
.serialize(SingletonMapRecursive {
delegate: crate::value::Serializer,
})
.map_err(ser::Error::custom)?;
self.mapping.insert(Value::String(name.to_owned()), value);
Ok(())
}
fn end(mut self) -> Result<Self::Ok, Self::Error> {
self.map.serialize_value(&self.mapping)?;
self.map.end()
}
}
impl<'de, D> Deserializer<'de> for SingletonMapRecursive<D>
where
D: Deserializer<'de>,
{
type Error = D::Error;
fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate
.deserialize_any(SingletonMapRecursive { delegate: visitor })
}
fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate
.deserialize_bool(SingletonMapRecursive { delegate: visitor })
}
fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate
.deserialize_i8(SingletonMapRecursive { delegate: visitor })
}
fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate
.deserialize_i16(SingletonMapRecursive { delegate: visitor })
}
fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate
.deserialize_i32(SingletonMapRecursive { delegate: visitor })
}
fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate
.deserialize_i64(SingletonMapRecursive { delegate: visitor })
}
fn deserialize_i128<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate
.deserialize_i128(SingletonMapRecursive { delegate: visitor })
}
fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate
.deserialize_u8(SingletonMapRecursive { delegate: visitor })
}
fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate
.deserialize_u16(SingletonMapRecursive { delegate: visitor })
}
fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate
.deserialize_u32(SingletonMapRecursive { delegate: visitor })
}
fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate
.deserialize_u64(SingletonMapRecursive { delegate: visitor })
}
fn deserialize_u128<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate
.deserialize_u128(SingletonMapRecursive { delegate: visitor })
}
fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate
.deserialize_f32(SingletonMapRecursive { delegate: visitor })
}
fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate
.deserialize_f64(SingletonMapRecursive { delegate: visitor })
}
fn deserialize_char<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate
.deserialize_char(SingletonMapRecursive { delegate: visitor })
}
fn deserialize_str<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate
.deserialize_str(SingletonMapRecursive { delegate: visitor })
}
fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate
.deserialize_string(SingletonMapRecursive { delegate: visitor })
}
fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate
.deserialize_bytes(SingletonMapRecursive { delegate: visitor })
}
fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate
.deserialize_byte_buf(SingletonMapRecursive { delegate: visitor })
}
fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate
.deserialize_option(SingletonMapRecursiveAsEnum {
name: "",
delegate: visitor,
})
}
fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate
.deserialize_unit(SingletonMapRecursive { delegate: visitor })
}
fn deserialize_unit_struct<V>(
self,
name: &'static str,
visitor: V,
) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate
.deserialize_unit_struct(name, SingletonMapRecursive { delegate: visitor })
}
fn deserialize_newtype_struct<V>(
self,
name: &'static str,
visitor: V,
) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate
.deserialize_newtype_struct(name, SingletonMapRecursive { delegate: visitor })
}
fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate
.deserialize_seq(SingletonMapRecursive { delegate: visitor })
}
fn deserialize_tuple<V>(self, len: usize, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate
.deserialize_tuple(len, SingletonMapRecursive { delegate: visitor })
}
fn deserialize_tuple_struct<V>(
self,
name: &'static str,
len: usize,
visitor: V,
) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate.deserialize_tuple_struct(
name,
len,
SingletonMapRecursive { delegate: visitor },
)
}
fn deserialize_map<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate
.deserialize_map(SingletonMapRecursive { delegate: visitor })
}
fn deserialize_struct<V>(
self,
name: &'static str,
fields: &'static [&'static str],
visitor: V,
) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate.deserialize_struct(
name,
fields,
SingletonMapRecursive { delegate: visitor },
)
}
fn deserialize_enum<V>(
self,
name: &'static str,
_variants: &'static [&'static str],
visitor: V,
) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate.deserialize_any(SingletonMapRecursiveAsEnum {
name,
delegate: visitor,
})
}
fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate
.deserialize_identifier(SingletonMapRecursive { delegate: visitor })
}
fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.delegate
.deserialize_ignored_any(SingletonMapRecursive { delegate: visitor })
}
fn is_human_readable(&self) -> bool {
self.delegate.is_human_readable()
}
}
impl<'de, V> Visitor<'de> for SingletonMapRecursive<V>
where
V: Visitor<'de>,
{
type Value = V::Value;
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
self.delegate.expecting(formatter)
}
fn visit_bool<E>(self, v: bool) -> Result<Self::Value, E>
where
E: de::Error,
{
self.delegate.visit_bool(v)
}
fn visit_i8<E>(self, v: i8) -> Result<Self::Value, E>
where
E: de::Error,
{
self.delegate.visit_i8(v)
}
fn visit_i16<E>(self, v: i16) -> Result<Self::Value, E>
where
E: de::Error,
{
self.delegate.visit_i16(v)
}
fn visit_i32<E>(self, v: i32) -> Result<Self::Value, E>
where
E: de::Error,
{
self.delegate.visit_i32(v)
}
fn visit_i64<E>(self, v: i64) -> Result<Self::Value, E>
where
E: de::Error,
{
self.delegate.visit_i64(v)
}
fn visit_i128<E>(self, v: i128) -> Result<Self::Value, E>
where
E: de::Error,
{
self.delegate.visit_i128(v)
}
fn visit_u8<E>(self, v: u8) -> Result<Self::Value, E>
where
E: de::Error,
{
self.delegate.visit_u8(v)
}
fn visit_u16<E>(self, v: u16) -> Result<Self::Value, E>
where
E: de::Error,
{
self.delegate.visit_u16(v)
}
fn visit_u32<E>(self, v: u32) -> Result<Self::Value, E>
where
E: de::Error,
{
self.delegate.visit_u32(v)
}
fn visit_u64<E>(self, v: u64) -> Result<Self::Value, E>
where
E: de::Error,
{
self.delegate.visit_u64(v)
}
fn visit_u128<E>(self, v: u128) -> Result<Self::Value, E>
where
E: de::Error,
{
self.delegate.visit_u128(v)
}
fn visit_f32<E>(self, v: f32) -> Result<Self::Value, E>
where
E: de::Error,
{
self.delegate.visit_f32(v)
}
fn visit_f64<E>(self, v: f64) -> Result<Self::Value, E>
where
E: de::Error,
{
self.delegate.visit_f64(v)
}
fn visit_char<E>(self, v: char) -> Result<Self::Value, E>
where
E: de::Error,
{
self.delegate.visit_char(v)
}
fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
where
E: de::Error,
{
self.delegate.visit_str(v)
}
fn visit_borrowed_str<E>(self, v: &'de str) -> Result<Self::Value, E>
where
E: de::Error,
{
self.delegate.visit_borrowed_str(v)
}
fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
where
E: de::Error,
{
self.delegate.visit_string(v)
}
fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
where
E: de::Error,
{
self.delegate.visit_bytes(v)
}
fn visit_borrowed_bytes<E>(self, v: &'de [u8]) -> Result<Self::Value, E>
where
E: de::Error,
{
self.delegate.visit_borrowed_bytes(v)
}
fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E>
where
E: de::Error,
{
self.delegate.visit_byte_buf(v)
}
fn visit_none<E>(self) -> Result<Self::Value, E>
where
E: de::Error,
{
self.delegate.visit_none()
}
fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
where
D: Deserializer<'de>,
{
self.delegate.visit_some(SingletonMapRecursive {
delegate: deserializer,
})
}
fn visit_unit<E>(self) -> Result<Self::Value, E>
where
E: de::Error,
{
self.delegate.visit_unit()
}
fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
where
D: Deserializer<'de>,
{
self.delegate.visit_newtype_struct(SingletonMapRecursive {
delegate: deserializer,
})
}
fn visit_seq<A>(self, seq: A) -> Result<Self::Value, A::Error>
where
A: SeqAccess<'de>,
{
self.delegate
.visit_seq(SingletonMapRecursive { delegate: seq })
}
fn visit_map<A>(self, map: A) -> Result<Self::Value, A::Error>
where
A: MapAccess<'de>,
{
self.delegate
.visit_map(SingletonMapRecursive { delegate: map })
}
}
impl<'de, T> DeserializeSeed<'de> for SingletonMapRecursive<T>
where
T: DeserializeSeed<'de>,
{
type Value = T::Value;
fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
where
D: Deserializer<'de>,
{
self.delegate.deserialize(SingletonMapRecursive {
delegate: deserializer,
})
}
}
impl<'de, S> SeqAccess<'de> for SingletonMapRecursive<S>
where
S: SeqAccess<'de>,
{
type Error = S::Error;
fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
where
T: DeserializeSeed<'de>,
{
self.delegate
.next_element_seed(SingletonMapRecursive { delegate: seed })
}
}
impl<'de, M> MapAccess<'de> for SingletonMapRecursive<M>
where
M: MapAccess<'de>,
{
type Error = M::Error;
fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Self::Error>
where
K: DeserializeSeed<'de>,
{
self.delegate
.next_key_seed(SingletonMapRecursive { delegate: seed })
}
fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Self::Error>
where
V: DeserializeSeed<'de>,
{
self.delegate
.next_value_seed(SingletonMapRecursive { delegate: seed })
}
}
struct SingletonMapRecursiveAsEnum<D> {
name: &'static str,
delegate: D,
}
impl<'de, V> Visitor<'de> for SingletonMapRecursiveAsEnum<V>
where
V: Visitor<'de>,
{
type Value = V::Value;
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
self.delegate.expecting(formatter)
}
fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
where
E: de::Error,
{
self.delegate.visit_enum(de::value::StrDeserializer::new(v))
}
fn visit_borrowed_str<E>(self, v: &'de str) -> Result<Self::Value, E>
where
E: de::Error,
{
self.delegate
.visit_enum(de::value::BorrowedStrDeserializer::new(v))
}
fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
where
E: de::Error,
{
self.delegate
.visit_enum(de::value::StringDeserializer::new(v))
}
fn visit_none<E>(self) -> Result<Self::Value, E>
where
E: de::Error,
{
self.delegate.visit_none()
}
fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
where
D: Deserializer<'de>,
{
self.delegate.visit_some(SingletonMapRecursive {
delegate: deserializer,
})
}
fn visit_unit<E>(self) -> Result<Self::Value, E>
where
E: de::Error,
{
self.delegate.visit_unit()
}
fn visit_map<A>(self, map: A) -> Result<Self::Value, A::Error>
where
A: MapAccess<'de>,
{
self.delegate.visit_enum(SingletonMapRecursiveAsEnum {
name: self.name,
delegate: map,
})
}
}
impl<'de, D> EnumAccess<'de> for SingletonMapRecursiveAsEnum<D>
where
D: MapAccess<'de>,
{
type Error = D::Error;
type Variant = Self;
fn variant_seed<V>(mut self, seed: V) -> Result<(V::Value, Self::Variant), Self::Error>
where
V: DeserializeSeed<'de>,
{
match self.delegate.next_key_seed(seed)? {
Some(value) => Ok((value, self)),
None => Err(de::Error::invalid_value(
Unexpected::Map,
&"map with a single key",
)),
}
}
}
impl<'de, D> VariantAccess<'de> for SingletonMapRecursiveAsEnum<D>
where
D: MapAccess<'de>,
{
type Error = D::Error;
fn unit_variant(self) -> Result<(), Self::Error> {
Err(de::Error::invalid_type(Unexpected::Map, &"unit variant"))
}
fn newtype_variant_seed<T>(mut self, seed: T) -> Result<T::Value, Self::Error>
where
T: DeserializeSeed<'de>,
{
let value = self
.delegate
.next_value_seed(SingletonMapRecursive { delegate: seed })?;
match self.delegate.next_key()? {
None => Ok(value),
Some(IgnoredAny) => Err(de::Error::invalid_value(
Unexpected::Map,
&"map with a single key",
)),
}
}
fn tuple_variant<V>(mut self, len: usize, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
let value = self.delegate.next_value_seed(TupleVariantSeed {
len,
visitor: SingletonMapRecursive { delegate: visitor },
})?;
match self.delegate.next_key()? {
None => Ok(value),
Some(IgnoredAny) => Err(de::Error::invalid_value(
Unexpected::Map,
&"map with a single key",
)),
}
}
fn struct_variant<V>(
mut self,
fields: &'static [&'static str],
visitor: V,
) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
let value = self.delegate.next_value_seed(StructVariantSeed {
name: self.name,
fields,
visitor: SingletonMapRecursive { delegate: visitor },
})?;
match self.delegate.next_key()? {
None => Ok(value),
Some(IgnoredAny) => Err(de::Error::invalid_value(
Unexpected::Map,
&"map with a single key",
)),
}
}
}
struct TupleVariantSeed<V> {
len: usize,
visitor: V,
}
impl<'de, V> DeserializeSeed<'de> for TupleVariantSeed<V>
where
V: Visitor<'de>,
{
type Value = V::Value;
fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
where
D: Deserializer<'de>,
{
deserializer.deserialize_tuple(self.len, self.visitor)
}
}
struct StructVariantSeed<V> {
name: &'static str,
fields: &'static [&'static str],
visitor: V,
}
impl<'de, V> DeserializeSeed<'de> for StructVariantSeed<V>
where
V: Visitor<'de>,
{
type Value = V::Value;
fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
where
D: Deserializer<'de>,
{
deserializer.deserialize_struct(self.name, self.fields, self.visitor)
}
}
}