aboutsummaryrefslogtreecommitdiffstats
path: root/src/serde/ser.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/serde/ser.rs')
-rw-r--r--src/serde/ser.rs329
1 files changed, 329 insertions, 0 deletions
diff --git a/src/serde/ser.rs b/src/serde/ser.rs
new file mode 100644
index 0000000..2875ed2
--- /dev/null
+++ b/src/serde/ser.rs
@@ -0,0 +1,329 @@
+// Tests for the serializer and deserializer are located in tests/serde_/mod.rs.
+// They can be run with `cargo test --features serde_tests`.
+
+use serde_base::ser::{Error as SerdeError, Serialize, Serializer as SerdeSerializer};
+
+use {Error, EventWriter, PlistEvent};
+
+impl SerdeError for Error {
+ fn custom<T: Into<String>>(msg: T) -> Self {
+ Error::Serde(msg.into())
+ }
+
+ fn invalid_value(_: &str) -> Self {
+ Error::InvalidData
+ }
+}
+
+pub struct Serializer<W: EventWriter> {
+ writer: W,
+}
+
+impl<W: EventWriter> Serializer<W> {
+ pub fn new(writer: W) -> Serializer<W> {
+ Serializer { writer: writer }
+ }
+
+ #[inline]
+ fn emit(&mut self, event: PlistEvent) -> Result<(), <Self as SerdeSerializer>::Error> {
+ Ok(self.writer.write(&event)?)
+ }
+
+ pub fn into_inner(self) -> W {
+ self.writer
+ }
+
+ // Emit {key: value}
+ fn single_key_dict(&mut self, key: String) -> Result<(), <Self as SerdeSerializer>::Error> {
+ try!(self.emit(PlistEvent::StartDictionary(Some(1))));
+ try!(self.emit(PlistEvent::StringValue(key)));
+ Ok(())
+ }
+
+ fn single_key_dict_end(&mut self) -> Result<(), <Self as SerdeSerializer>::Error> {
+ try!(self.emit(PlistEvent::EndDictionary));
+ Ok(())
+ }
+}
+
+impl<W: EventWriter> SerdeSerializer for Serializer<W> {
+ type Error = Error;
+ type SeqState = ();
+ type TupleState = ();
+ type TupleStructState = ();
+ type TupleVariantState = ();
+ type MapState = ();
+ type StructState = ();
+ type StructVariantState = ();
+
+ fn serialize_bool(&mut self, v: bool) -> Result<(), Self::Error> {
+ self.emit(PlistEvent::BooleanValue(v))
+ }
+
+ fn serialize_isize(&mut self, v: isize) -> Result<(), Self::Error> {
+ self.serialize_i64(v as i64)
+ }
+
+ fn serialize_i8(&mut self, v: i8) -> Result<(), Self::Error> {
+ self.serialize_i64(v as i64)
+ }
+
+ fn serialize_i16(&mut self, v: i16) -> Result<(), Self::Error> {
+ self.serialize_i64(v as i64)
+ }
+
+ fn serialize_i32(&mut self, v: i32) -> Result<(), Self::Error> {
+ self.serialize_i64(v as i64)
+ }
+
+ fn serialize_i64(&mut self, v: i64) -> Result<(), Self::Error> {
+ self.emit(PlistEvent::IntegerValue(v))
+ }
+
+ fn serialize_usize(&mut self, v: usize) -> Result<(), Self::Error> {
+ self.serialize_u64(v as u64)
+ }
+
+ fn serialize_u8(&mut self, v: u8) -> Result<(), Self::Error> {
+ self.serialize_u64(v as u64)
+ }
+
+ fn serialize_u16(&mut self, v: u16) -> Result<(), Self::Error> {
+ self.serialize_u64(v as u64)
+ }
+
+ fn serialize_u32(&mut self, v: u32) -> Result<(), Self::Error> {
+ self.serialize_u64(v as u64)
+ }
+
+ fn serialize_u64(&mut self, v: u64) -> Result<(), Self::Error> {
+ self.emit(PlistEvent::IntegerValue(v as i64))
+ }
+
+ fn serialize_f32(&mut self, v: f32) -> Result<(), Self::Error> {
+ self.serialize_f64(v as f64)
+ }
+
+ fn serialize_f64(&mut self, v: f64) -> Result<(), Self::Error> {
+ self.emit(PlistEvent::RealValue(v))
+ }
+
+ fn serialize_char(&mut self, v: char) -> Result<(), Self::Error> {
+ let sstr = v.to_string();
+ self.serialize_str(&sstr)
+ }
+
+ fn serialize_str(&mut self, value: &str) -> Result<(), Self::Error> {
+ self.emit(PlistEvent::StringValue(value.to_owned()))
+ }
+
+ fn serialize_bytes(&mut self, value: &[u8]) -> Result<(), Self::Error> {
+ self.emit(PlistEvent::DataValue(value.to_owned()))
+ }
+
+ fn serialize_unit(&mut self) -> Result<(), Self::Error> {
+ // Emit empty string
+ self.emit(PlistEvent::StringValue(String::new()))
+ }
+
+ fn serialize_unit_struct(&mut self, _name: &'static str) -> Result<(), Self::Error> {
+ self.serialize_unit()
+ }
+
+ fn serialize_unit_variant(&mut self,
+ _name: &'static str,
+ _variant_index: usize,
+ variant: &'static str)
+ -> Result<(), Self::Error> {
+ self.single_key_dict(variant.to_owned())?;
+ self.serialize_unit()?;
+ self.single_key_dict_end()?;
+ Ok(())
+ }
+
+ fn serialize_newtype_struct<T: Serialize>(&mut self,
+ _name: &'static str,
+ value: T)
+ -> Result<(), Self::Error> {
+ value.serialize(self)
+ }
+
+ fn serialize_newtype_variant<T: Serialize>(&mut self,
+ _name: &'static str,
+ _variant_index: usize,
+ variant: &'static str,
+ value: T)
+ -> Result<(), Self::Error> {
+ self.single_key_dict(variant.to_owned())?;
+ value.serialize(self)?;
+ self.single_key_dict_end()
+ }
+
+ fn serialize_none(&mut self) -> Result<(), Self::Error> {
+ self.single_key_dict("None".to_owned())?;
+ self.serialize_unit()?;
+ self.single_key_dict_end()
+ }
+
+ fn serialize_some<T: Serialize>(&mut self, value: T) -> Result<(), Self::Error> {
+ self.single_key_dict("Some".to_owned())?;
+ value.serialize(self)?;
+ self.single_key_dict_end()
+ }
+
+ fn serialize_seq(&mut self, len: Option<usize>) -> Result<Self::SeqState, Self::Error> {
+ let len = len.map(|len| len as u64);
+ self.emit(PlistEvent::StartArray(len))
+ }
+
+ fn serialize_seq_elt<T: Serialize>(&mut self,
+ _state: &mut Self::SeqState,
+ value: T)
+ -> Result<(), Self::Error> {
+ value.serialize(self)
+ }
+
+ fn serialize_seq_end(&mut self, _state: Self::SeqState) -> Result<(), Self::Error> {
+ self.emit(PlistEvent::EndArray)
+ }
+
+ fn serialize_seq_fixed_size(&mut self, size: usize) -> Result<Self::SeqState, Self::Error> {
+ self.serialize_seq(Some(size))
+ }
+
+ fn serialize_tuple(&mut self, len: usize) -> Result<Self::TupleState, Self::Error> {
+ self.serialize_seq_fixed_size(len)
+ }
+
+ fn serialize_tuple_elt<T: Serialize>(&mut self,
+ state: &mut Self::TupleState,
+ value: T)
+ -> Result<(), Self::Error> {
+ self.serialize_seq_elt(state, value)
+ }
+
+ fn serialize_tuple_end(&mut self, state: Self::TupleState) -> Result<(), Self::Error> {
+ self.serialize_seq_end(state)
+ }
+
+ fn serialize_tuple_struct(&mut self,
+ _name: &'static str,
+ len: usize)
+ -> Result<Self::TupleStructState, Self::Error> {
+ self.serialize_seq_fixed_size(len)
+ }
+
+ fn serialize_tuple_struct_elt<T: Serialize>(&mut self,
+ state: &mut Self::TupleStructState,
+ value: T)
+ -> Result<(), Self::Error> {
+ self.serialize_seq_elt(state, value)
+ }
+
+ fn serialize_tuple_struct_end(&mut self,
+ state: Self::TupleStructState)
+ -> Result<(), Self::Error> {
+ self.serialize_seq_end(state)
+ }
+
+ fn serialize_tuple_variant(&mut self,
+ _name: &'static str,
+ _variant_index: usize,
+ variant: &'static str,
+ len: usize)
+ -> Result<Self::TupleVariantState, Self::Error> {
+
+ self.single_key_dict(variant.to_owned())?;
+ self.serialize_seq_fixed_size(len)
+ }
+
+ fn serialize_tuple_variant_elt<T: Serialize>(&mut self,
+ state: &mut Self::TupleVariantState,
+ value: T)
+ -> Result<(), Self::Error> {
+ self.serialize_seq_elt(state, value)
+ }
+ fn serialize_tuple_variant_end(&mut self,
+ state: Self::TupleVariantState)
+ -> Result<(), Self::Error> {
+ self.serialize_seq_end(state)?;
+ self.single_key_dict_end()
+ }
+
+
+ fn serialize_map(&mut self, len: Option<usize>) -> Result<Self::MapState, Self::Error> {
+ let len = len.map(|len| len as u64);
+ self.emit(PlistEvent::StartDictionary(len))
+ }
+
+ fn serialize_map_key<T>(&mut self,
+ _state: &mut Self::MapState,
+ key: T)
+ -> Result<(), Self::Error>
+ where T: Serialize
+ {
+ key.serialize(self)
+ }
+
+ fn serialize_map_value<T>(&mut self,
+ _state: &mut Self::MapState,
+ value: T)
+ -> Result<(), Self::Error>
+ where T: Serialize
+ {
+ value.serialize(self)
+ }
+
+ fn serialize_map_end(&mut self, _state: Self::MapState) -> Result<(), Self::Error> {
+ self.emit(PlistEvent::EndDictionary)
+ }
+
+ fn serialize_struct(&mut self,
+ _name: &'static str,
+ len: usize)
+ -> Result<Self::StructState, Self::Error> {
+ self.serialize_map(Some(len))?;
+ Ok(())
+ }
+
+ fn serialize_struct_elt<V: Serialize>(&mut self,
+ state: &mut Self::StructState,
+ key: &'static str,
+ value: V)
+ -> Result<(), Self::Error> {
+ self.serialize_map_key(state, key)?;
+ self.serialize_map_value(state, value)?;
+ Ok(())
+ }
+
+ fn serialize_struct_end(&mut self, state: Self::StructState) -> Result<(), Self::Error> {
+ self.serialize_map_end(state)
+ }
+
+ fn serialize_struct_variant(&mut self,
+ name: &'static str,
+ _variant_index: usize,
+ variant: &'static str,
+ len: usize)
+ -> Result<Self::StructVariantState, Self::Error> {
+ self.single_key_dict(variant.to_owned())?;
+ self.serialize_struct(name, len)?;
+ Ok(())
+ }
+
+ fn serialize_struct_variant_elt<V: Serialize>(&mut self,
+ state: &mut Self::StructVariantState,
+ key: &'static str,
+ value: V)
+ -> Result<(), Self::Error> {
+ self.serialize_struct_elt(state, key, value)
+ }
+
+ fn serialize_struct_variant_end(&mut self,
+ state: Self::StructVariantState)
+ -> Result<(), Self::Error> {
+ self.serialize_struct_end(state)?;
+ self.single_key_dict_end()?;
+ Ok(())
+ }
+}