diff --git a/serde/src/de/mod.rs b/serde/src/de/mod.rs index 571c73b7..210b36b0 100644 --- a/serde/src/de/mod.rs +++ b/serde/src/de/mod.rs @@ -11,71 +11,6 @@ use collections::{String, Vec}; use core::fmt; /////////////////////////////////////////////////////////////////////////////// -/// Macro helper to not have to re-implement all the defaulted methods. -/// Every given method ignores all arguments and forwards to `deserialize`. -/// Note that `deserialize_enum` simply returns an `Error::invalid_type`. -macro_rules! de_forward_to_deserialize { - ($($func:ident),*) => { - $(de_forward_to_deserialize!{func: $func})* - }; - (func: deserialize_unit_struct) => { - de_forward_to_deserialize!{named: deserialize_unit_struct} - }; - (func: deserialize_newtype_struct) => { - de_forward_to_deserialize!{named: deserialize_newtype_struct} - }; - (func: deserialize_tuple) => { - de_forward_to_deserialize!{tup_fn: deserialize_tuple} - }; - (func: deserialize_seq_fixed_size) => { - de_forward_to_deserialize!{tup_fn: deserialize_seq_fixed_size} - }; - (func: deserialize_tuple_struct) => { - #[inline] - fn deserialize_tuple_struct<__V>(&mut self, _: &str, _: usize, visitor: __V) -> Result<__V::Value, Self::Error> - where __V: $crate::de::Visitor { - self.deserialize(visitor) - } - }; - (func: deserialize_struct) => { - #[inline] - fn deserialize_struct<__V>(&mut self, _: &str, _: &[&str], visitor: __V) -> Result<__V::Value, Self::Error> - where __V: $crate::de::Visitor { - self.deserialize(visitor) - } - }; - (func: deserialize_enum) => { - #[inline] - fn deserialize_enum<__V>(&mut self, _: &str, _: &[&str], _: __V) -> Result<__V::Value, Self::Error> - where __V: $crate::de::EnumVisitor { - Err($crate::de::Error::invalid_type($crate::de::Type::Enum)) - } - }; - (named: $func:ident) => { - #[inline] - fn $func<__V>(&mut self, _: &str, visitor: __V) -> Result<__V::Value, Self::Error> - where __V: $crate::de::Visitor { - self.deserialize(visitor) - } - }; - (tup_fn: $func: ident) => { - #[inline] - fn $func<__V>(&mut self, _: usize, visitor: __V) -> Result<__V::Value, Self::Error> - where __V: $crate::de::Visitor { - self.deserialize(visitor) - } - }; - (func: $func:ident) => { - #[inline] - fn $func<__V>(&mut self, visitor: __V) -> Result<__V::Value, Self::Error> - where __V: $crate::de::Visitor { - self.deserialize(visitor) - } - }; -} - -/////////////////////////////////////////////////////////////////////////////// -// modules come after macros pub mod impls; pub mod value; diff --git a/serde/src/de/value.rs b/serde/src/de/value.rs index bf3e0631..6f9e7d4b 100644 --- a/serde/src/de/value.rs +++ b/serde/src/de/value.rs @@ -178,20 +178,10 @@ impl de::Deserializer for UnitDeserializer { type Error = E; - de_forward_to_deserialize!{ - deserialize_bool, - deserialize_f64, deserialize_f32, - deserialize_u8, deserialize_u16, deserialize_u32, deserialize_u64, deserialize_usize, - deserialize_i8, deserialize_i16, deserialize_i32, deserialize_i64, deserialize_isize, - deserialize_char, deserialize_str, deserialize_string, - deserialize_ignored_any, - deserialize_bytes, - deserialize_unit_struct, deserialize_unit, - deserialize_seq, deserialize_seq_fixed_size, - deserialize_map, deserialize_newtype_struct, deserialize_struct_field, - deserialize_tuple, - deserialize_enum, - deserialize_struct, deserialize_tuple_struct + forward_to_deserialize! { + bool usize u8 u16 u32 u64 isize i8 i16 i32 i64 f32 f64 char str string + unit seq seq_fixed_size bytes map unit_struct newtype_struct + tuple_struct struct struct_field tuple enum ignored_any } fn deserialize(&mut self, mut visitor: V) -> Result @@ -229,21 +219,11 @@ macro_rules! primitive_deserializer { { type Error = E; - de_forward_to_deserialize!{ - deserialize_bool, - deserialize_f64, deserialize_f32, - deserialize_u8, deserialize_u16, deserialize_u32, deserialize_u64, deserialize_usize, - deserialize_i8, deserialize_i16, deserialize_i32, deserialize_i64, deserialize_isize, - deserialize_char, deserialize_str, deserialize_string, - deserialize_ignored_any, - deserialize_bytes, - deserialize_unit_struct, deserialize_unit, - deserialize_seq, deserialize_seq_fixed_size, - deserialize_map, deserialize_newtype_struct, deserialize_struct_field, - deserialize_tuple, - deserialize_enum, - deserialize_struct, deserialize_tuple_struct, - deserialize_option + forward_to_deserialize! { + bool usize u8 u16 u32 u64 isize i8 i16 i32 i64 f32 f64 char str + string unit option seq seq_fixed_size bytes map unit_struct + newtype_struct tuple_struct struct struct_field tuple enum + ignored_any } fn deserialize(&mut self, mut visitor: V) -> Result @@ -311,20 +291,10 @@ impl<'a, E> de::Deserializer for StrDeserializer<'a, E> visitor.visit(self) } - de_forward_to_deserialize!{ - deserialize_bool, - deserialize_f64, deserialize_f32, - deserialize_u8, deserialize_u16, deserialize_u32, deserialize_u64, deserialize_usize, - deserialize_i8, deserialize_i16, deserialize_i32, deserialize_i64, deserialize_isize, - deserialize_char, deserialize_str, deserialize_string, - deserialize_ignored_any, - deserialize_bytes, - deserialize_unit_struct, deserialize_unit, - deserialize_seq, deserialize_seq_fixed_size, - deserialize_map, deserialize_newtype_struct, deserialize_struct_field, - deserialize_tuple, - deserialize_struct, deserialize_tuple_struct, - deserialize_option + forward_to_deserialize! { + bool usize u8 u16 u32 u64 isize i8 i16 i32 i64 f32 f64 char str string + unit option seq seq_fixed_size bytes map unit_struct newtype_struct + tuple_struct struct struct_field tuple ignored_any } } @@ -408,20 +378,10 @@ impl de::Deserializer for StringDeserializer visitor.visit(self) } - de_forward_to_deserialize!{ - deserialize_bool, - deserialize_f64, deserialize_f32, - deserialize_u8, deserialize_u16, deserialize_u32, deserialize_u64, deserialize_usize, - deserialize_i8, deserialize_i16, deserialize_i32, deserialize_i64, deserialize_isize, - deserialize_char, deserialize_str, deserialize_string, - deserialize_ignored_any, - deserialize_bytes, - deserialize_unit_struct, deserialize_unit, - deserialize_seq, deserialize_seq_fixed_size, - deserialize_map, deserialize_newtype_struct, deserialize_struct_field, - deserialize_tuple, - deserialize_struct, deserialize_tuple_struct, - deserialize_option + forward_to_deserialize! { + bool usize u8 u16 u32 u64 isize i8 i16 i32 i64 f32 f64 char str string + unit option seq seq_fixed_size bytes map unit_struct newtype_struct + tuple_struct struct struct_field tuple ignored_any } } @@ -507,20 +467,10 @@ impl<'a, E> de::Deserializer for CowStrDeserializer<'a, E> visitor.visit(self) } - de_forward_to_deserialize!{ - deserialize_bool, - deserialize_f64, deserialize_f32, - deserialize_u8, deserialize_u16, deserialize_u32, deserialize_u64, deserialize_usize, - deserialize_i8, deserialize_i16, deserialize_i32, deserialize_i64, deserialize_isize, - deserialize_char, deserialize_str, deserialize_string, - deserialize_ignored_any, - deserialize_bytes, - deserialize_unit_struct, deserialize_unit, - deserialize_seq, deserialize_seq_fixed_size, - deserialize_map, deserialize_newtype_struct, deserialize_struct_field, - deserialize_tuple, - deserialize_struct, deserialize_tuple_struct, - deserialize_option + forward_to_deserialize! { + bool usize u8 u16 u32 u64 isize i8 i16 i32 i64 f32 f64 char str string + unit option seq seq_fixed_size bytes map unit_struct newtype_struct + tuple_struct struct struct_field tuple ignored_any } } @@ -599,21 +549,10 @@ impl de::Deserializer for SeqDeserializer visitor.visit_seq(self) } - de_forward_to_deserialize!{ - deserialize_bool, - deserialize_f64, deserialize_f32, - deserialize_u8, deserialize_u16, deserialize_u32, deserialize_u64, deserialize_usize, - deserialize_i8, deserialize_i16, deserialize_i32, deserialize_i64, deserialize_isize, - deserialize_char, deserialize_str, deserialize_string, - deserialize_ignored_any, - deserialize_bytes, - deserialize_unit_struct, deserialize_unit, - deserialize_seq, deserialize_seq_fixed_size, - deserialize_map, deserialize_newtype_struct, deserialize_struct_field, - deserialize_tuple, - deserialize_enum, - deserialize_struct, deserialize_tuple_struct, - deserialize_option + forward_to_deserialize! { + bool usize u8 u16 u32 u64 isize i8 i16 i32 i64 f32 f64 char str string + unit option seq seq_fixed_size bytes map unit_struct newtype_struct + tuple_struct struct struct_field tuple enum ignored_any } } @@ -722,21 +661,10 @@ impl de::Deserializer for SeqVisitorDeserializer visitor.visit_seq(&mut self.visitor) } - de_forward_to_deserialize!{ - deserialize_bool, - deserialize_f64, deserialize_f32, - deserialize_u8, deserialize_u16, deserialize_u32, deserialize_u64, deserialize_usize, - deserialize_i8, deserialize_i16, deserialize_i32, deserialize_i64, deserialize_isize, - deserialize_char, deserialize_str, deserialize_string, - deserialize_ignored_any, - deserialize_bytes, - deserialize_unit_struct, deserialize_unit, - deserialize_seq, deserialize_seq_fixed_size, - deserialize_map, deserialize_newtype_struct, deserialize_struct_field, - deserialize_tuple, - deserialize_enum, - deserialize_struct, deserialize_tuple_struct, - deserialize_option + forward_to_deserialize! { + bool usize u8 u16 u32 u64 isize i8 i16 i32 i64 f32 f64 char str string + unit option seq seq_fixed_size bytes map unit_struct newtype_struct + tuple_struct struct struct_field tuple enum ignored_any } } @@ -797,21 +725,10 @@ impl de::Deserializer for MapDeserializer visitor.visit_map(self) } - de_forward_to_deserialize!{ - deserialize_bool, - deserialize_f64, deserialize_f32, - deserialize_u8, deserialize_u16, deserialize_u32, deserialize_u64, deserialize_usize, - deserialize_i8, deserialize_i16, deserialize_i32, deserialize_i64, deserialize_isize, - deserialize_char, deserialize_str, deserialize_string, - deserialize_ignored_any, - deserialize_bytes, - deserialize_unit_struct, deserialize_unit, - deserialize_seq, deserialize_seq_fixed_size, - deserialize_map, deserialize_newtype_struct, deserialize_struct_field, - deserialize_tuple, - deserialize_enum, - deserialize_struct, deserialize_tuple_struct, - deserialize_option + forward_to_deserialize! { + bool usize u8 u16 u32 u64 isize i8 i16 i32 i64 f32 f64 char str string + unit option seq seq_fixed_size bytes map unit_struct newtype_struct + tuple_struct struct struct_field tuple enum ignored_any } } @@ -928,21 +845,10 @@ impl de::Deserializer for MapVisitorDeserializer visitor.visit_map(&mut self.visitor) } - de_forward_to_deserialize!{ - deserialize_bool, - deserialize_f64, deserialize_f32, - deserialize_u8, deserialize_u16, deserialize_u32, deserialize_u64, deserialize_usize, - deserialize_i8, deserialize_i16, deserialize_i32, deserialize_i64, deserialize_isize, - deserialize_char, deserialize_str, deserialize_string, - deserialize_ignored_any, - deserialize_bytes, - deserialize_unit_struct, deserialize_unit, - deserialize_seq, deserialize_seq_fixed_size, - deserialize_map, deserialize_newtype_struct, deserialize_struct_field, - deserialize_tuple, - deserialize_enum, - deserialize_struct, deserialize_tuple_struct, - deserialize_option + forward_to_deserialize! { + bool usize u8 u16 u32 u64 isize i8 i16 i32 i64 f32 f64 char str string + unit option seq seq_fixed_size bytes map unit_struct newtype_struct + tuple_struct struct struct_field tuple enum ignored_any } } @@ -975,25 +881,13 @@ impl<'a, E> de::Deserializer for BytesDeserializer<'a, E> } } - de_forward_to_deserialize!{ - deserialize_bool, - deserialize_f64, deserialize_f32, - deserialize_u8, deserialize_u16, deserialize_u32, deserialize_u64, deserialize_usize, - deserialize_i8, deserialize_i16, deserialize_i32, deserialize_i64, deserialize_isize, - deserialize_char, deserialize_str, deserialize_string, - deserialize_ignored_any, - deserialize_bytes, - deserialize_unit_struct, deserialize_unit, - deserialize_seq, deserialize_seq_fixed_size, - deserialize_map, deserialize_newtype_struct, deserialize_struct_field, - deserialize_tuple, - deserialize_enum, - deserialize_struct, deserialize_tuple_struct, - deserialize_option + forward_to_deserialize! { + bool usize u8 u16 u32 u64 isize i8 i16 i32 i64 f32 f64 char str string + unit option seq seq_fixed_size bytes map unit_struct newtype_struct + tuple_struct struct struct_field tuple enum ignored_any } } - /////////////////////////////////////////////////////////////////////////////// #[cfg(any(feature = "std", feature = "collections"))] @@ -1026,20 +920,9 @@ impl de::Deserializer for ByteBufDeserializer } } - de_forward_to_deserialize!{ - deserialize_bool, - deserialize_f64, deserialize_f32, - deserialize_u8, deserialize_u16, deserialize_u32, deserialize_u64, deserialize_usize, - deserialize_i8, deserialize_i16, deserialize_i32, deserialize_i64, deserialize_isize, - deserialize_char, deserialize_str, deserialize_string, - deserialize_ignored_any, - deserialize_bytes, - deserialize_unit_struct, deserialize_unit, - deserialize_seq, deserialize_seq_fixed_size, - deserialize_map, deserialize_newtype_struct, deserialize_struct_field, - deserialize_tuple, - deserialize_enum, - deserialize_struct, deserialize_tuple_struct, - deserialize_option + forward_to_deserialize! { + bool usize u8 u16 u32 u64 isize i8 i16 i32 i64 f32 f64 char str string + unit option seq seq_fixed_size bytes map unit_struct newtype_struct + tuple_struct struct struct_field tuple enum ignored_any } } diff --git a/serde/src/lib.rs b/serde/src/lib.rs index 54dcc120..78a0531e 100644 --- a/serde/src/lib.rs +++ b/serde/src/lib.rs @@ -45,6 +45,9 @@ macro_rules! format { ($s:expr, $($rest:tt)*) => ($s) } +#[macro_use] +mod macros; + pub mod bytes; pub mod de; #[cfg(feature = "std")] diff --git a/serde/src/macros.rs b/serde/src/macros.rs new file mode 100644 index 00000000..a997a148 --- /dev/null +++ b/serde/src/macros.rs @@ -0,0 +1,132 @@ +/// Helper to forward `Deserializer` methods to `Deserializer::deserialize`. +/// Every given method ignores all arguments and forwards to `deserialize`. +/// Note that `deserialize_enum` simply returns an `Error::invalid_type`; a +/// better approach is tracked in [serde-rs/serde#521][1]. +/// +/// ```rust,ignore +/// impl Deserializer for MyDeserializer { +/// fn deserialize(&mut self, visitor: V) -> Result +/// where V: Visitor +/// { +/// /* ... */ +/// } +/// +/// forward_to_deserialize! { +/// bool usize u8 u16 u32 u64 isize i8 i16 i32 i64 f32 f64 char str string +/// unit option seq seq_fixed_size bytes map unit_struct newtype_struct +/// tuple_struct struct struct_field tuple enum ignored_any +/// } +/// } +/// ``` +/// +/// [1]: https://github.com/serde-rs/serde/issues/521 +#[macro_export] +macro_rules! forward_to_deserialize { + (@func bool) => { + forward_to_deserialize!{@forward deserialize_bool()} + }; + (@func usize) => { + forward_to_deserialize!{@forward deserialize_usize()} + }; + (@func u8) => { + forward_to_deserialize!{@forward deserialize_u8()} + }; + (@func u16) => { + forward_to_deserialize!{@forward deserialize_u16()} + }; + (@func u32) => { + forward_to_deserialize!{@forward deserialize_u32()} + }; + (@func u64) => { + forward_to_deserialize!{@forward deserialize_u64()} + }; + (@func isize) => { + forward_to_deserialize!{@forward deserialize_isize()} + }; + (@func i8) => { + forward_to_deserialize!{@forward deserialize_i8()} + }; + (@func i16) => { + forward_to_deserialize!{@forward deserialize_i16()} + }; + (@func i32) => { + forward_to_deserialize!{@forward deserialize_i32()} + }; + (@func i64) => { + forward_to_deserialize!{@forward deserialize_i64()} + }; + (@func f32) => { + forward_to_deserialize!{@forward deserialize_f32()} + }; + (@func f64) => { + forward_to_deserialize!{@forward deserialize_f64()} + }; + (@func char) => { + forward_to_deserialize!{@forward deserialize_char()} + }; + (@func str) => { + forward_to_deserialize!{@forward deserialize_str()} + }; + (@func string) => { + forward_to_deserialize!{@forward deserialize_string()} + }; + (@func unit) => { + forward_to_deserialize!{@forward deserialize_unit()} + }; + (@func option) => { + forward_to_deserialize!{@forward deserialize_option()} + }; + (@func seq) => { + forward_to_deserialize!{@forward deserialize_seq()} + }; + (@func seq_fixed_size) => { + forward_to_deserialize!{@forward deserialize_seq_fixed_size(usize)} + }; + (@func bytes) => { + forward_to_deserialize!{@forward deserialize_bytes()} + }; + (@func map) => { + forward_to_deserialize!{@forward deserialize_map()} + }; + (@func unit_struct) => { + forward_to_deserialize!{@forward deserialize_unit_struct(&'static str)} + }; + (@func newtype_struct) => { + forward_to_deserialize!{@forward deserialize_newtype_struct(&'static str)} + }; + (@func tuple_struct) => { + forward_to_deserialize!{@forward deserialize_tuple_struct(&'static str, usize)} + }; + (@func struct) => { + forward_to_deserialize!{@forward deserialize_struct(&'static str, &'static [&'static str])} + }; + (@func struct_field) => { + forward_to_deserialize!{@forward deserialize_struct_field()} + }; + (@func tuple) => { + forward_to_deserialize!{@forward deserialize_tuple(usize)} + }; + (@func enum) => { + #[inline] + fn deserialize_enum<__V>(&mut self, _: &str, _: &[&str], _: __V) -> ::std::result::Result<__V::Value, Self::Error> + where __V: $crate::de::EnumVisitor + { + Err($crate::de::Error::invalid_type($crate::de::Type::Enum)) + } + }; + (@func ignored_any) => { + forward_to_deserialize!{@forward deserialize_ignored_any()} + }; + (@forward $func:ident($($arg:ty),*)) => { + #[inline] + fn $func<__V>(&mut self, $(_: $arg,)* visitor: __V) -> ::std::result::Result<__V::Value, Self::Error> + where __V: $crate::de::Visitor + { + self.deserialize(visitor) + } + }; + + ($($func:ident)*) => { + $(forward_to_deserialize!{@func $func})* + }; +}