//! Generic deserialization framework. pub mod impls; pub mod value; /////////////////////////////////////////////////////////////////////////////// pub trait Error { fn syntax_error() -> Self; fn end_of_stream_error() -> Self; fn unknown_field_error(field: &str) -> Self; fn missing_field_error(field: &'static str) -> Self; } /////////////////////////////////////////////////////////////////////////////// pub trait Deserialize { /// Deserialize this value given this `Deserializer`. fn deserialize(deserializer: &mut D) -> Result where D: Deserializer; } /////////////////////////////////////////////////////////////////////////////// /// `Deserializer` is an abstract trait that can deserialize values into a `Visitor`. pub trait Deserializer { type Error: Error; /// The `visit` method walks a visitor through a value as it is being deserialized. fn visit(&mut self, visitor: V) -> Result where V: Visitor; /// The `visit_option` method allows a `Deserialize` type to inform the `Deserializer` that /// it's expecting an optional value. This allows deserializers that encode an optional value /// as a nullable value to convert the null value into a `None`, and a regular value as /// `Some(value)`. #[inline] fn visit_option(&mut self, visitor: V) -> Result where V: Visitor, { self.visit(visitor) } /// The `visit_seq` method allows a `Deserialize` type to inform the `Deserializer` that it's /// expecting a sequence of values. This allows deserializers to parse sequences that aren't /// tagged as sequences. #[inline] fn visit_seq(&mut self, visitor: V) -> Result where V: Visitor, { self.visit(visitor) } /// The `visit_map` method allows a `Deserialize` type to inform the `Deserializer` that it's /// expecting a map of values. This allows deserializers to parse sequences that aren't tagged /// as maps. #[inline] fn visit_map(&mut self, visitor: V) -> Result where V: Visitor, { self.visit(visitor) } /// The `visit_named_unit` method allows a `Deserialize` type to inform the `Deserializer` that /// it's expecting a named unit. This allows deserializers to a named unit that aren't tagged /// as a named unit. #[inline] fn visit_named_unit(&mut self, _name: &str, visitor: V) -> Result where V: Visitor, { self.visit(visitor) } /// The `visit_named_seq` method allows a `Deserialize` type to inform the `Deserializer` that /// it's expecting a named sequence of values. This allows deserializers to parse sequences /// that aren't tagged as sequences. #[inline] fn visit_named_seq(&mut self, _name: &str, visitor: V) -> Result where V: Visitor, { self.visit_seq(visitor) } /// The `visit_named_map` method allows a `Deserialize` type to inform the `Deserializer` that /// it's expecting a map of values. This allows deserializers to parse sequences that aren't /// tagged as maps. #[inline] fn visit_named_map(&mut self, _name: &str, visitor: V) -> Result where V: Visitor, { self.visit_map(visitor) } /// The `visit_enum` method allows a `Deserialize` type to inform the `Deserializer` that it's /// expecting an enum value. This allows deserializers that provide a custom enumeration /// serialization to properly deserialize the type. #[inline] fn visit_enum(&mut self, _enum: &str, _visitor: V) -> Result where V: EnumVisitor, { Err(Error::syntax_error()) } /// The `visit_bytes` method allows a `Deserialize` type to inform the `Deserializer` that it's /// expecting a `Vec`. This allows deserializers that provide a custom byte vector /// serialization to properly deserialize the type. #[inline] fn visit_bytes(&mut self, visitor: V) -> Result where V: Visitor, { self.visit(visitor) } } /////////////////////////////////////////////////////////////////////////////// pub trait Visitor { type Value; fn visit_bool(&mut self, _v: bool) -> Result where E: Error, { Err(Error::syntax_error()) } fn visit_isize(&mut self, v: isize) -> Result where E: Error, { self.visit_i64(v as i64) } fn visit_i8(&mut self, v: i8) -> Result where E: Error, { self.visit_i64(v as i64) } fn visit_i16(&mut self, v: i16) -> Result where E: Error, { self.visit_i64(v as i64) } fn visit_i32(&mut self, v: i32) -> Result where E: Error, { self.visit_i64(v as i64) } fn visit_i64(&mut self, _v: i64) -> Result where E: Error, { Err(Error::syntax_error()) } fn visit_usize(&mut self, v: usize) -> Result where E: Error, { self.visit_u64(v as u64) } fn visit_u8(&mut self, v: u8) -> Result where E: Error, { self.visit_u64(v as u64) } fn visit_u16(&mut self, v: u16) -> Result where E: Error, { self.visit_u64(v as u64) } fn visit_u32(&mut self, v: u32) -> Result where E: Error, { self.visit_u64(v as u64) } fn visit_u64(&mut self, _v: u64) -> Result where E: Error, { Err(Error::syntax_error()) } fn visit_f32(&mut self, v: f32) -> Result where E: Error, { self.visit_f64(v as f64) } fn visit_f64(&mut self, _v: f64) -> Result where E: Error, { Err(Error::syntax_error()) } #[inline] fn visit_char(&mut self, v: char) -> Result where E: Error, { // FIXME: this allocation is required in order to be compatible with stable rust, which // doesn't support encoding a `char` into a stack buffer. self.visit_string(v.to_string()) } fn visit_str(&mut self, _v: &str) -> Result where E: Error, { Err(Error::syntax_error()) } #[inline] fn visit_string(&mut self, v: String) -> Result where E: Error, { self.visit_str(&v) } fn visit_unit(&mut self) -> Result where E: Error, { Err(Error::syntax_error()) } #[inline] fn visit_named_unit(&mut self, _name: &str) -> Result where E: Error, { self.visit_unit() } fn visit_none(&mut self) -> Result where E: Error, { Err(Error::syntax_error()) } fn visit_some(&mut self, _deserializer: &mut D) -> Result where D: Deserializer, { Err(Error::syntax_error()) } fn visit_seq(&mut self, _visitor: V) -> Result where V: SeqVisitor, { Err(Error::syntax_error()) } fn visit_map(&mut self, _visitor: V) -> Result where V: MapVisitor, { Err(Error::syntax_error()) } fn visit_bytes(&mut self, _v: &[u8]) -> Result where E: Error, { Err(Error::syntax_error()) } fn visit_byte_buf(&mut self, _v: Vec) -> Result where E: Error, { Err(Error::syntax_error()) } } /////////////////////////////////////////////////////////////////////////////// pub trait SeqVisitor { type Error: Error; fn visit(&mut self) -> Result, Self::Error> where T: Deserialize; fn end(&mut self) -> Result<(), Self::Error>; #[inline] fn size_hint(&self) -> (usize, Option) { (0, None) } } impl<'a, V> SeqVisitor for &'a mut V where V: SeqVisitor { type Error = V::Error; #[inline] fn visit(&mut self) -> Result, V::Error> where T: Deserialize { (**self).visit() } #[inline] fn end(&mut self) -> Result<(), V::Error> { (**self).end() } #[inline] fn size_hint(&self) -> (usize, Option) { (**self).size_hint() } } /////////////////////////////////////////////////////////////////////////////// pub trait MapVisitor { type Error: Error; #[inline] fn visit(&mut self) -> Result, Self::Error> where K: Deserialize, V: Deserialize, { match try!(self.visit_key()) { Some(key) => { let value = try!(self.visit_value()); Ok(Some((key, value))) } None => Ok(None) } } fn visit_key(&mut self) -> Result, Self::Error> where K: Deserialize; fn visit_value(&mut self) -> Result where V: Deserialize; fn end(&mut self) -> Result<(), Self::Error>; #[inline] fn size_hint(&self) -> (usize, Option) { (0, None) } fn missing_field(&mut self, field: &'static str) -> Result where V: Deserialize, { Err(Error::missing_field_error(field)) } } impl<'a, V_> MapVisitor for &'a mut V_ where V_: MapVisitor { type Error = V_::Error; #[inline] fn visit(&mut self) -> Result, V_::Error> where K: Deserialize, V: Deserialize, { (**self).visit() } #[inline] fn visit_key(&mut self) -> Result, V_::Error> where K: Deserialize { (**self).visit_key() } #[inline] fn visit_value(&mut self) -> Result where V: Deserialize { (**self).visit_value() } #[inline] fn end(&mut self) -> Result<(), V_::Error> { (**self).end() } #[inline] fn size_hint(&self) -> (usize, Option) { (**self).size_hint() } } /////////////////////////////////////////////////////////////////////////////// /// `EnumVisitor` is a visitor that is created by the `Deserialize` and passed to the /// `Deserializer` in order to deserialize enums. pub trait EnumVisitor { type Value; fn visit(&mut self, visitor: V) -> Result where V: VariantVisitor; } /////////////////////////////////////////////////////////////////////////////// /// `VariantVisitor` is a visitor that is created by the `Deserializer` and passed to the /// `Deserialize` in order to deserialize a specific enum variant. pub trait VariantVisitor { type Error: Error; /// `visit_variant` is called to identify which variant to deserialize. fn visit_variant(&mut self) -> Result where V: Deserialize; /// `visit_unit` is called when deserializing a variant with no values. fn visit_unit(&mut self) -> Result<(), Self::Error> { Err(Error::syntax_error()) } /// `visit_seq` is called when deserializing a tuple-like variant. fn visit_seq(&mut self, _visitor: V) -> Result where V: Visitor { Err(Error::syntax_error()) } /// `visit_map` is called when deserializing a struct-like variant. fn visit_map(&mut self, _visitor: V) -> Result where V: Visitor { Err(Error::syntax_error()) } } impl<'a, T> VariantVisitor for &'a mut T where T: VariantVisitor { type Error = T::Error; fn visit_variant(&mut self) -> Result where V: Deserialize { (**self).visit_variant() } fn visit_unit(&mut self) -> Result<(), T::Error> { (**self).visit_unit() } fn visit_seq(&mut self, visitor: V) -> Result where V: Visitor, { (**self).visit_seq(visitor) } fn visit_map(&mut self, visitor: V) -> Result where V: Visitor, { (**self).visit_map(visitor) } } /////////////////////////////////////////////////////////////////////////////// pub trait EnumSeqVisitor { type Value; fn visit(&mut self, visitor: V) -> Result where V: SeqVisitor; } /////////////////////////////////////////////////////////////////////////////// pub trait EnumMapVisitor { type Value; fn visit(&mut self, visitor: V) -> Result where V: MapVisitor; }