diff --git a/serde_test/src/configure.rs b/serde_test/src/configure.rs index fa4233bb..e92ccafc 100644 --- a/serde_test/src/configure.rs +++ b/serde_test/src/configure.rs @@ -1,3 +1,5 @@ +use std::fmt; + use serde::{Deserialize, Deserializer, Serialize, Serializer}; use serde::ser::{SerializeMap, SerializeSeq, SerializeStruct, SerializeStructVariant, SerializeTuple, SerializeTupleStruct, SerializeTupleVariant}; @@ -15,19 +17,6 @@ pub trait Configure { } impl Configure for T {} -pub trait Configuration { - fn is_human_readable(&self) -> bool { - true - } -} -impl Configuration for Readable {} - -fn assert(_: T) -where - T: Configure, -{ - -} impl Serialize for Readable where @@ -76,6 +65,33 @@ where } } +impl<'de, T> DeserializeSeed<'de> for Readable +where + T: DeserializeSeed<'de>, +{ + type Value = T::Value; + + fn deserialize(self, deserializer: D) -> Result + where + D: Deserializer<'de>, + { + self.0.deserialize(Readable(deserializer)) + } +} +impl<'de, T> DeserializeSeed<'de> for Compact +where + T: DeserializeSeed<'de>, +{ + type Value = T::Value; + + fn deserialize(self, deserializer: D) -> Result + where + D: Deserializer<'de>, + { + self.0.deserialize(Compact(deserializer)) + } +} + macro_rules! forward_method { ($name: ident (self $(, $arg: ident : $arg_type: ty)* ) -> $return_type: ty) => { @@ -372,3 +388,208 @@ macro_rules! impl_serializer { impl_serializer!(Readable, true); impl_serializer!(Compact, false); + + +use serde::de::{Visitor, EnumAccess, VariantAccess, MapAccess, DeserializeSeed, SeqAccess, Error}; + +macro_rules! forward_deserialize_methods { + ( $wrapper : ident ( $( $name: ident ),* ) ) => { + $( + fn $name(self, visitor: V) -> Result where V: Visitor<'de> { + (self.0).$name($wrapper(visitor)) + } + )* + }; +} + + +macro_rules! impl_deserializer { + ($wrapper : ident, $is_human_readable : expr) => { + impl <'de, D> Deserializer<'de> for $wrapper where D: Deserializer<'de> { + type Error = D::Error; + + forward_deserialize_methods! { + $wrapper ( + deserialize_any, + deserialize_bool, + deserialize_u8, + deserialize_u16, + deserialize_u32, + deserialize_u64, + deserialize_i8, + deserialize_i16, + deserialize_i32, + deserialize_i64, + deserialize_f32, + deserialize_f64, + deserialize_char, + deserialize_str, + deserialize_string, + deserialize_bytes, + deserialize_byte_buf, + deserialize_option, + deserialize_unit, + deserialize_seq, + deserialize_map, + deserialize_identifier, + deserialize_ignored_any + ) + } + + fn deserialize_unit_struct(self, name: &'static str, visitor: V) -> Result where V: Visitor<'de> { + self.0.deserialize_unit_struct(name, $wrapper(visitor)) + } + fn deserialize_newtype_struct(self, name: &'static str, visitor: V) -> Result where V: Visitor<'de> { + self.0.deserialize_newtype_struct(name, $wrapper(visitor)) + } + fn deserialize_tuple(self, len: usize, visitor: V) -> Result where V: Visitor<'de> { + self.0.deserialize_tuple(len, $wrapper(visitor)) + } + fn deserialize_tuple_struct(self, name: &'static str, len: usize, visitor: V) -> Result where V: Visitor<'de> { + self.0.deserialize_tuple_struct(name, len, $wrapper(visitor)) + } + fn deserialize_struct(self, name: &'static str, fields: &'static [&'static str], visitor: V) -> Result where V: Visitor<'de> { + self.0.deserialize_struct(name, fields, $wrapper(visitor)) + } + fn deserialize_enum(self, name: &'static str, variants: &'static [&'static str], visitor: V) -> Result where V: Visitor<'de> { + self.0.deserialize_enum(name, variants, $wrapper(visitor)) + } + + fn is_human_readable(&self) -> bool { + $is_human_readable + } + } + + impl<'de, D> Visitor<'de> for $wrapper where D: Visitor<'de> { + type Value = D::Value; + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + self.0.expecting(formatter) + } + fn visit_bool(self, v: bool) -> Result where E: Error { + self.0.visit_bool(v) + } + fn visit_i8(self, v: i8) -> Result where E: Error { + self.0.visit_i8(v) + } + fn visit_i16(self, v: i16) -> Result where E: Error { + self.0.visit_i16(v) + } + fn visit_i32(self, v: i32) -> Result where E: Error { + self.0.visit_i32(v) + } + fn visit_i64(self, v: i64) -> Result where E: Error { + self.0.visit_i64(v) + } + fn visit_u8(self, v: u8) -> Result where E: Error { + self.0.visit_u8(v) + } + fn visit_u16(self, v: u16) -> Result where E: Error { + self.0.visit_u16(v) + } + fn visit_u32(self, v: u32) -> Result where E: Error { + self.0.visit_u32(v) + } + fn visit_u64(self, v: u64) -> Result where E: Error { + self.0.visit_u64(v) + } + fn visit_f32(self, v: f32) -> Result where E: Error { + self.0.visit_f32(v) + } + fn visit_f64(self, v: f64) -> Result where E: Error { + self.0.visit_f64(v) + } + fn visit_char(self, v: char) -> Result where E: Error { + self.0.visit_char(v) + } + fn visit_str(self, v: &str) -> Result where E: Error { + self.0.visit_str(v) + } + fn visit_borrowed_str(self, v: &'de str) -> Result where E: Error { + self.0.visit_borrowed_str(v) + } + fn visit_string(self, v: String) -> Result where E: Error { + self.0.visit_string(v) + } + fn visit_bytes(self, v: &[u8]) -> Result where E: Error { + self.0.visit_bytes(v) + } + fn visit_borrowed_bytes(self, v: &'de [u8]) -> Result where E: Error { + self.0.visit_borrowed_bytes(v) + } + fn visit_byte_buf(self, v: Vec) -> Result where E: Error { + self.0.visit_byte_buf(v) + } + fn visit_none(self) -> Result where E: Error { + self.0.visit_none() + } + fn visit_some(self, deserializer: D2) -> Result where D2: Deserializer<'de> { + self.0.visit_some($wrapper(deserializer)) + } + fn visit_unit(self) -> Result where E: Error { + self.0.visit_unit() + } + fn visit_newtype_struct(self, deserializer: D2) -> Result where D2: Deserializer<'de> { + self.0.visit_newtype_struct($wrapper(deserializer)) + } + fn visit_seq(self, seq: V) -> Result where V: SeqAccess<'de> { + self.0.visit_seq($wrapper(seq)) + } + fn visit_map(self, map: V) -> Result where V: MapAccess<'de> { + self.0.visit_map($wrapper(map)) + } + fn visit_enum(self, data: V) -> Result where V: EnumAccess<'de> { + self.0.visit_enum($wrapper(data)) + } + } + + impl<'de, D> SeqAccess<'de> for $wrapper where D: SeqAccess<'de> { + type Error = D::Error; + fn next_element_seed(&mut self, seed: T) -> Result, D::Error> where T: DeserializeSeed<'de> { + self.0.next_element_seed($wrapper(seed)) + } + fn size_hint(&self) -> Option { + self.0.size_hint() + } + } + + impl<'de, D> MapAccess<'de> for $wrapper where D: MapAccess<'de> { + type Error = D::Error; + fn next_key_seed(&mut self, seed: K) -> Result, D::Error> where K: DeserializeSeed<'de> { + self.0.next_key_seed($wrapper(seed)) + } + fn next_value_seed(&mut self, seed: V) -> Result where V: DeserializeSeed<'de> { + self.0.next_value_seed($wrapper(seed)) + } + fn size_hint(&self) -> Option { + self.0.size_hint() + } + } + + impl<'de, D> EnumAccess<'de> for $wrapper where D: EnumAccess<'de> { + type Error = D::Error; + type Variant = $wrapper; + fn variant_seed(self, seed: V) -> Result<(V::Value, Self::Variant), Self::Error> where V: DeserializeSeed<'de> { + self.0.variant_seed($wrapper(seed)).map(|(value, variant)| (value, $wrapper(variant))) + } + } + + impl<'de, D> VariantAccess<'de> for $wrapper where D: VariantAccess<'de> { + type Error = D::Error; + fn unit_variant(self) -> Result<(), D::Error> { + self.0.unit_variant() + } + fn newtype_variant_seed(self, seed: T) -> Result where T: DeserializeSeed<'de> { + self.0.newtype_variant_seed($wrapper(seed)) + } + fn tuple_variant(self, len: usize, visitor: V) -> Result where V: Visitor<'de> { + self.0.tuple_variant(len, $wrapper(visitor)) + } + fn struct_variant(self, fields: &'static [&'static str], visitor: V) -> Result where V: Visitor<'de> { + self.0.struct_variant(fields, $wrapper(visitor)) + } + } + } +} + +impl_deserializer!(Readable, true); +impl_deserializer!(Compact, false);