use serde::ser; use std::collections::BTreeMap; use std::error::Error; use std::fmt; use crate::Value; #[derive(Debug)] pub enum SerializerError { Custom(String), } impl fmt::Display for SerializerError { fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { match *self { SerializerError::Custom(ref s) => fmt.write_str(s), } } } impl Error for SerializerError { fn description(&self) -> &str { "Value serializer error" } } impl ser::Error for SerializerError { fn custom(msg: T) -> SerializerError { SerializerError::Custom(msg.to_string()) } } impl ser::Serialize for Value { fn serialize(&self, s: S) -> Result { match *self { Value::Bool(v) => s.serialize_bool(v), Value::U8(v) => s.serialize_u8(v), Value::U16(v) => s.serialize_u16(v), Value::U32(v) => s.serialize_u32(v), Value::U64(v) => s.serialize_u64(v), Value::I8(v) => s.serialize_i8(v), Value::I16(v) => s.serialize_i16(v), Value::I32(v) => s.serialize_i32(v), Value::I64(v) => s.serialize_i64(v), Value::F32(v) => s.serialize_f32(v), Value::F64(v) => s.serialize_f64(v), Value::Char(v) => s.serialize_char(v), Value::String(ref v) => s.serialize_str(v), Value::Unit => s.serialize_unit(), Value::Option(None) => s.serialize_none(), Value::Option(Some(ref v)) => s.serialize_some(v), Value::Newtype(ref v) => s.serialize_newtype_struct("", v), Value::Seq(ref v) => v.serialize(s), Value::Map(ref v) => v.serialize(s), Value::Bytes(ref v) => s.serialize_bytes(v), } } } pub fn to_value(value: T) -> Result { value.serialize(Serializer) } struct Serializer; impl ser::Serializer for Serializer { type Ok = Value; type Error = SerializerError; type SerializeSeq = SerializeSeq; type SerializeTuple = SerializeTuple; type SerializeTupleStruct = SerializeTupleStruct; type SerializeTupleVariant = SerializeTupleVariant; type SerializeMap = SerializeMap; type SerializeStruct = SerializeStruct; type SerializeStructVariant = SerializeStructVariant; fn serialize_bool(self, v: bool) -> Result { Ok(Value::Bool(v)) } fn serialize_i8(self, v: i8) -> Result { Ok(Value::I8(v)) } fn serialize_i16(self, v: i16) -> Result { Ok(Value::I16(v)) } fn serialize_i32(self, v: i32) -> Result { Ok(Value::I32(v)) } fn serialize_i64(self, v: i64) -> Result { Ok(Value::I64(v)) } fn serialize_u8(self, v: u8) -> Result { Ok(Value::U8(v)) } fn serialize_u16(self, v: u16) -> Result { Ok(Value::U16(v)) } fn serialize_u32(self, v: u32) -> Result { Ok(Value::U32(v)) } fn serialize_u64(self, v: u64) -> Result { Ok(Value::U64(v)) } fn serialize_f32(self, v: f32) -> Result { Ok(Value::F32(v)) } fn serialize_f64(self, v: f64) -> Result { Ok(Value::F64(v)) } fn serialize_char(self, v: char) -> Result { Ok(Value::Char(v)) } fn serialize_str(self, v: &str) -> Result { Ok(Value::String(v.to_string())) } fn serialize_bytes(self, v: &[u8]) -> Result { Ok(Value::Bytes(v.to_vec())) } fn serialize_none(self) -> Result { Ok(Value::Option(None)) } fn serialize_some( self, value: &T ) -> Result where T: ser::Serialize { value.serialize(Serializer).map(|v| Value::Option(Some(Box::new(v)))) } fn serialize_unit(self) -> Result { Ok(Value::Unit) } fn serialize_unit_struct( self, _name: &'static str ) -> Result { Ok(Value::Unit) } fn serialize_unit_variant( self, _name: &'static str, _variant_index: u32, variant: &'static str, ) -> Result { Ok(Value::String(variant.to_string())) } fn serialize_newtype_struct( self, _name: &'static str, value: &T ) -> Result where T: ser::Serialize { value.serialize(Serializer).map(|v| Value::Newtype(Box::new(v))) } fn serialize_newtype_variant( self, _name: &'static str, _variant_index: u32, variant: &'static str, value: &T ) -> Result where T: ser::Serialize { value.serialize(Serializer).map(|v| { let mut map = BTreeMap::new(); map.insert(Value::String(variant.to_string()), v); Value::Map(map) }) } fn serialize_seq( self, _len: Option ) -> Result { Ok(SerializeSeq(vec![])) } fn serialize_tuple( self, _len: usize ) -> Result { Ok(SerializeTuple(vec![])) } fn serialize_tuple_struct( self, _name: &'static str, _len: usize ) -> Result { Ok(SerializeTupleStruct(vec![])) } fn serialize_tuple_variant( self, _name: &'static str, _variant_index: u32, variant: &'static str, len: usize ) -> Result { Ok(SerializeTupleVariant( Value::String(variant.to_string()), Vec::with_capacity(len), )) } fn serialize_map( self, _len: Option ) -> Result { Ok(SerializeMap { map: BTreeMap::new(), key: None }) } fn serialize_struct( self, _name: &'static str, _len: usize ) -> Result { Ok(SerializeStruct(BTreeMap::new())) } fn serialize_struct_variant( self, _name: &'static str, _variant_index: u32, variant: &'static str, _len: usize ) -> Result { Ok(SerializeStructVariant( Value::String(variant.to_string()), BTreeMap::new(), )) } } struct SerializeSeq(Vec); impl ser::SerializeSeq for SerializeSeq { type Ok = Value; type Error = SerializerError; fn serialize_element( &mut self, value: &T ) -> Result<(), Self::Error> where T: ser::Serialize { let value = value.serialize(Serializer)?; self.0.push(value); Ok(()) } fn end(self) -> Result { Ok(Value::Seq(self.0)) } } struct SerializeTuple(Vec); impl ser::SerializeTuple for SerializeTuple { type Ok = Value; type Error = SerializerError; fn serialize_element( &mut self, value: &T ) -> Result<(), Self::Error> where T: ser::Serialize { let value = value.serialize(Serializer)?; self.0.push(value); Ok(()) } fn end(self) -> Result { Ok(Value::Seq(self.0)) } } struct SerializeTupleStruct(Vec); impl ser::SerializeTupleStruct for SerializeTupleStruct { type Ok = Value; type Error = SerializerError; fn serialize_field( &mut self, value: &T ) -> Result<(), Self::Error> where T: ser::Serialize { let value = value.serialize(Serializer)?; self.0.push(value); Ok(()) } fn end(self) -> Result { Ok(Value::Seq(self.0)) } } struct SerializeTupleVariant(Value, Vec); impl ser::SerializeTupleVariant for SerializeTupleVariant { type Ok = Value; type Error = SerializerError; fn serialize_field( &mut self, value: &T ) -> Result<(), Self::Error> where T: ser::Serialize { let value = value.serialize(Serializer)?; self.1.push(value); Ok(()) } fn end(self) -> Result { let mut map = BTreeMap::new(); map.insert(self.0, Value::Seq(self.1)); Ok(Value::Map(map)) } } struct SerializeMap { map: BTreeMap, key: Option, } impl ser::SerializeMap for SerializeMap { type Ok = Value; type Error = SerializerError; fn serialize_key(&mut self, key: &T) -> Result<(), Self::Error> where T: ser::Serialize { let key = key.serialize(Serializer)?; self.key = Some(key); Ok(()) } fn serialize_value( &mut self, value: &T ) -> Result<(), Self::Error> where T: ser::Serialize { let value = value.serialize(Serializer)?; self.map.insert(self.key.take().unwrap(), value); Ok(()) } fn end(self) -> Result { Ok(Value::Map(self.map)) } } struct SerializeStruct(BTreeMap); impl ser::SerializeStruct for SerializeStruct { type Ok = Value; type Error = SerializerError; fn serialize_field( &mut self, key: &'static str, value: &T ) -> Result<(), Self::Error> where T: ser::Serialize { let key = Value::String(key.to_string()); let value = value.serialize(Serializer)?; self.0.insert(key, value); Ok(()) } fn end(self) -> Result { Ok(Value::Map(self.0)) } } struct SerializeStructVariant(Value, BTreeMap); impl ser::SerializeStructVariant for SerializeStructVariant { type Ok = Value; type Error = SerializerError; fn serialize_field( &mut self, key: &'static str, value: &T ) -> Result<(), Self::Error> where T: ser::Serialize { let key = Value::String(key.to_string()); let value = value.serialize(Serializer)?; self.1.insert(key, value); Ok(()) } fn end(self) -> Result { let mut map = BTreeMap::new(); map.insert(self.0, Value::Map(self.1)); Ok(Value::Map(map)) } }