From 726ff5ed31d609ea63a2fa8dccf8c1ea14b1b938 Mon Sep 17 00:00:00 2001 From: Jethro Beekman Date: Fri, 3 Jan 2020 10:40:19 +0100 Subject: [PATCH] impl Serializer for &mut fmt::Formatter --- serde/src/ser/impls.rs | 125 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 124 insertions(+), 1 deletion(-) diff --git a/serde/src/ser/impls.rs b/serde/src/ser/impls.rs index 803c739e..a1346bfa 100644 --- a/serde/src/ser/impls.rs +++ b/serde/src/ser/impls.rs @@ -1,6 +1,6 @@ use lib::*; -use ser::{Error, Serialize, SerializeTuple, Serializer}; +use ser::{Error, Impossible, Serialize, SerializeTuple, Serializer}; //////////////////////////////////////////////////////////////////////////////// @@ -881,3 +881,126 @@ atomic_impl! { atomic_impl! { AtomicI64 AtomicU64 } + +//////////////////////////////////////////////////////////////////////////////// + +impl Error for fmt::Error { + fn custom(_msg: T) -> Self { + fmt::Error + } +} + +macro_rules! fmt_primitives { + ($($f:ident: $t:ty, )*) => {$( + fn $f(self, v: $t) -> fmt::Result { + write!(self, "{}", v) + } + )*} +} + +impl<'a, 'b> Serializer for &'a mut fmt::Formatter<'b> { + type Ok = (); + type Error = fmt::Error; + type SerializeSeq = Impossible<(), fmt::Error>; + type SerializeTuple = Impossible<(), fmt::Error>; + type SerializeTupleStruct = Impossible<(), fmt::Error>; + type SerializeTupleVariant = Impossible<(), fmt::Error>; + type SerializeMap = Impossible<(), fmt::Error>; + type SerializeStruct = Impossible<(), fmt::Error>; + type SerializeStructVariant = Impossible<(), fmt::Error>; + + fmt_primitives!( + serialize_str: &str, + serialize_bool: bool, + serialize_i8: i8, + serialize_i16: i16, + serialize_i32: i32, + serialize_i64: i64, + serialize_u8: u8, + serialize_u16: u16, + serialize_u32: u32, + serialize_u64: u64, + serialize_f32: f32, + serialize_f64: f64, + serialize_char: char, + serialize_unit_struct: &'static str, + ); + fn serialize_unit(self) -> fmt::Result { + Ok(()) + } + fn serialize_unit_variant(self, _: &'static str, _: u32, v: &'static str) -> fmt::Result { + write!(self, "{}", v) + } + + fn serialize_bytes(self, _v: &[u8]) -> fmt::Result { + Err(fmt::Error) + } + fn serialize_none(self) -> fmt::Result { + Err(fmt::Error) + } + fn serialize_some(self, _value: &T) -> fmt::Result + where + T: Serialize, + { + Err(fmt::Error) + } + fn serialize_newtype_struct(self, _name: &'static str, _value: &T) -> fmt::Result + where + T: Serialize, + { + Err(fmt::Error) + } + fn serialize_newtype_variant( + self, + _name: &'static str, + _variant_index: u32, + _variant: &'static str, + _value: &T, + ) -> fmt::Result + where + T: Serialize, + { + Err(fmt::Error) + } + fn serialize_seq(self, _len: Option) -> Result { + Err(fmt::Error) + } + fn serialize_tuple(self, _len: usize) -> Result { + Err(fmt::Error) + } + fn serialize_tuple_struct( + self, + _name: &'static str, + _len: usize, + ) -> Result { + Err(fmt::Error) + } + fn serialize_tuple_variant( + self, + _name: &'static str, + _variant_index: u32, + _variant: &'static str, + _len: usize, + ) -> Result { + Err(fmt::Error) + } + fn serialize_map(self, _len: Option) -> Result { + Err(fmt::Error) + } + fn serialize_struct( + self, + _name: &'static str, + _len: usize, + ) -> Result { + Err(fmt::Error) + } + fn serialize_struct_variant( + self, + _name: &'static str, + _variant_index: u32, + _variant: &'static str, + _len: usize, + ) -> Result { + Err(fmt::Error) + } +}