use crate::value::{Value, NestedValue, Map, Domain}; use serde::Serialize; use crate::value::error::{Error, Result}; use std::marker::PhantomData; pub struct Serializer, D: Domain> { phantom: PhantomData<(N, D)>, } pub struct SerializeDictionary, D: Domain> { next_key: Option, items: Map, phantom: PhantomData, } pub struct SerializeRecord, D: Domain> { name: &'static str, vec: Vec, phantom: PhantomData, } pub struct SerializeSequence, D: Domain> { vec: Vec, phantom: PhantomData, } impl, D: Domain> serde::Serializer for Serializer { type Ok = N; type Error = Error; type SerializeSeq = SerializeSequence; type SerializeTuple = SerializeRecord; type SerializeTupleStruct = SerializeRecord; type SerializeTupleVariant = SerializeRecord; type SerializeMap = SerializeDictionary; type SerializeStruct = SerializeRecord; type SerializeStructVariant = SerializeRecord; fn serialize_bool(self, v: bool) -> Result { Ok(Value::from(v).wrap()) } fn serialize_i8(self, v: i8) -> Result { Ok(Value::from(v).wrap()) } fn serialize_i16(self, v: i16) -> Result { Ok(Value::from(v).wrap()) } fn serialize_i32(self, v: i32) -> Result { Ok(Value::from(v).wrap()) } fn serialize_i64(self, v: i64) -> Result { Ok(Value::from(v).wrap()) } fn serialize_u8(self, v: u8) -> Result { Ok(Value::from(v).wrap()) } fn serialize_u16(self, v: u16) -> Result { Ok(Value::from(v).wrap()) } fn serialize_u32(self, v: u32) -> Result { Ok(Value::from(v).wrap()) } fn serialize_u64(self, v: u64) -> Result { Ok(Value::from(v).wrap()) } fn serialize_f32(self, v: f32) -> Result { Ok(Value::from(v).wrap()) } fn serialize_f64(self, v: f64) -> Result { Ok(Value::from(v).wrap()) } fn serialize_char(self, v: char) -> Result { Ok(Value::simple_record("UnicodeScalar", vec![Value::from(v as u32).wrap()]).wrap()) } fn serialize_str(self, v: &str) -> Result { Ok(Value::from(v).wrap()) } fn serialize_bytes(self, v: &[u8]) -> Result { Ok(Value::from(v).wrap()) } fn serialize_none(self) -> Result { Ok(Value::simple_record("None", vec![]).wrap()) } fn serialize_some(self, v: &T) -> Result where T: Serialize { Ok(Value::simple_record("Some", vec![to_value(v)?]).wrap()) } fn serialize_unit(self) -> Result { Ok(Value::simple_record("tuple", vec![]).wrap()) } fn serialize_unit_struct(self, name: &'static str) -> Result { Ok(Value::simple_record(name, vec![]).wrap()) } fn serialize_unit_variant(self, _name: &'static str, _variant: u32, variant_name: &'static str) -> Result { Ok(Value::simple_record(variant_name, vec![]).wrap()) } fn serialize_newtype_struct(self, name: &'static str, value: &T) -> Result where T: Serialize { if name == crate::value::value::MAGIC_VALUE { let b = unsafe { Box::from_raw(*((value as *const T) as *const u64) as *mut &Value) }; let v: &Value = *b; Ok(v.clone().wrap()) } else if name == crate::value::value::MAGIC_NESTEDVALUE { let b = unsafe { Box::from_raw(*((value as *const T) as *const u64) as *mut &N) }; let v: &N = *b; Ok(v.clone()) } else { // TODO: This is apparently discouraged, and we should apparently just serialize `value`? Ok(Value::simple_record(name, vec![to_value(value)?]).wrap()) } } fn serialize_newtype_variant(self, _name: &'static str, _variant: u32, variant_name: &'static str, value: &T) -> Result where T: Serialize { Ok(Value::simple_record(variant_name, vec![to_value(value)?]).wrap()) } fn serialize_seq(self, count: Option) -> Result { let vec = match count { Some(n) => Vec::with_capacity(n), None => Vec::new() }; Ok(SerializeSequence{ vec, phantom: PhantomData }) } fn serialize_tuple(self, count: usize) -> Result { Ok(SerializeRecord{ name: "tuple", vec: Vec::with_capacity(count), phantom: PhantomData }) } fn serialize_tuple_struct(self, name: &'static str, count: usize) -> Result { Ok(SerializeRecord{ name, vec: Vec::with_capacity(count), phantom: PhantomData }) } fn serialize_tuple_variant(self, _name: &'static str, _variant: u32, variant_name: &'static str, count: usize) -> Result { Ok(SerializeRecord{ name: variant_name, vec: Vec::with_capacity(count), phantom: PhantomData }) } fn serialize_map(self, _count: Option) -> Result { Ok(SerializeDictionary{ next_key: None, items: Map::new(), phantom: PhantomData }) } fn serialize_struct(self, name: &'static str, count: usize) -> Result { Ok(SerializeRecord{ name, vec: Vec::with_capacity(count), phantom: PhantomData }) } fn serialize_struct_variant(self, _name: &'static str, _variant: u32, variant_name: &'static str, count: usize) -> Result { Ok(SerializeRecord{ name: variant_name, vec: Vec::with_capacity(count), phantom: PhantomData }) } } impl, D: Domain> serde::ser::SerializeMap for SerializeDictionary { type Ok = N; type Error = Error; fn serialize_key(&mut self, key: &T) -> Result<(), D> where T: Serialize { self.next_key = Some(to_value(key)?); Ok(()) } fn serialize_value(&mut self, value: &T) -> Result<(), D> where T: Serialize { let key = self.next_key.take().unwrap(); self.items.insert(key, to_value(value)?); Ok(()) } fn end(self) -> Result { Ok(Value::from(self.items).wrap()) } } impl, D: Domain> SerializeRecord { fn push(&mut self, value: N) -> Result<(), D> { self.vec.push(value); Ok(()) } fn finish(self) -> Result { Ok(Value::simple_record(self.name, self.vec).wrap()) } } impl, D: Domain> serde::ser::SerializeStruct for SerializeRecord { type Ok = N; type Error = Error; fn serialize_field(&mut self, _name: &'static str, value: &T) -> Result<(), D> where T: Serialize { self.push(to_value(value)?) } fn end(self) -> Result { self.finish() } } impl, D: Domain> serde::ser::SerializeStructVariant for SerializeRecord { type Ok = N; type Error = Error; fn serialize_field(&mut self, _name: &'static str, value: &T) -> Result<(), D> where T: Serialize { self.push(to_value(value)?) } fn end(self) -> Result { self.finish() } } impl, D: Domain> serde::ser::SerializeTuple for SerializeRecord { type Ok = N; type Error = Error; fn serialize_element(&mut self, value: &T) -> Result<(), D> where T: Serialize { self.push(to_value(value)?) } fn end(self) -> Result { self.finish() } } impl, D: Domain> serde::ser::SerializeTupleStruct for SerializeRecord { type Ok = N; type Error = Error; fn serialize_field(&mut self, value: &T) -> Result<(), D> where T: Serialize { self.push(to_value(value)?) } fn end(self) -> Result { self.finish() } } impl, D: Domain> serde::ser::SerializeTupleVariant for SerializeRecord { type Ok = N; type Error = Error; fn serialize_field(&mut self, value: &T) -> Result<(), D> where T: Serialize { self.push(to_value(value)?) } fn end(self) -> Result { self.finish() } } impl, D: Domain> serde::ser::SerializeSeq for SerializeSequence { type Ok = N; type Error = Error; fn serialize_element(&mut self, value: &T) -> Result<(), D> where T: Serialize { self.vec.push(to_value(value)?); Ok(()) } fn end(self) -> Result { Ok(Value::from(self.vec).wrap()) } } pub fn to_value(value: T) -> Result where T: Serialize, N: NestedValue { value.serialize(Serializer{ phantom: PhantomData }) }