use std::collections::{HashMap, BTreeMap}; use std::hash::Hash; use std::marker::PhantomData; use std::num::FromPrimitive; use std::path; use std::str; /////////////////////////////////////////////////////////////////////////////// pub trait Error { fn syntax_error() -> Self; fn end_of_stream_error() -> Self; fn missing_field_error(&'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()) } } /////////////////////////////////////////////////////////////////////////////// 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, { // The unwraps in here should be safe. let mut s = &mut [0; 4]; let len = v.encode_utf8(s).unwrap(); self.visit_str(str::from_utf8(&s[..len]).unwrap()) } 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()) } } /////////////////////////////////////////////////////////////////////////////// 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() } } /////////////////////////////////////////////////////////////////////////////// pub trait EnumVisitor { type Value; fn visit(&mut self, visitor: V) -> Result where V: VariantVisitor; } /////////////////////////////////////////////////////////////////////////////// pub trait VariantVisitor { type Error: Error; fn visit_variant(&mut self) -> Result where V: Deserialize; fn visit_value(&mut self, _visitor: V) -> Result where V: Visitor; } 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_value(&mut self, visitor: V) -> Result where V: Visitor, { (**self).visit_value(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; } /////////////////////////////////////////////////////////////////////////////// pub struct UnitVisitor; impl Visitor for UnitVisitor { type Value = (); fn visit_unit(&mut self) -> Result<(), E> where E: Error, { Ok(()) } fn visit_seq(&mut self, mut visitor: V) -> Result<(), V::Error> where V: SeqVisitor, { visitor.end() } } impl Deserialize for () { fn deserialize(deserializer: &mut D) -> Result<(), D::Error> where D: Deserializer, { deserializer.visit(UnitVisitor) } } /////////////////////////////////////////////////////////////////////////////// struct BoolVisitor; impl Visitor for BoolVisitor { type Value = bool; fn visit_bool(&mut self, v: bool) -> Result where E: Error, { Ok(v) } } impl Deserialize for bool { fn deserialize(deserializer: &mut D) -> Result where D: Deserializer, { deserializer.visit(BoolVisitor) } } /////////////////////////////////////////////////////////////////////////////// macro_rules! impl_deserialize_num_method { ($src_ty:ty, $method:ident, $from_method:ident) => { #[inline] fn $method(&mut self, v: $src_ty) -> Result where E: Error, { match FromPrimitive::$from_method(v) { Some(v) => Ok(v), None => Err(Error::syntax_error()), } } } } pub struct PrimitiveVisitor { marker: PhantomData, } impl PrimitiveVisitor { #[inline] pub fn new() -> Self { PrimitiveVisitor { marker: PhantomData, } } } impl< T: Deserialize + FromPrimitive > self::Visitor for PrimitiveVisitor { type Value = T; impl_deserialize_num_method!(isize, visit_isize, from_isize); impl_deserialize_num_method!(i8, visit_i8, from_i8); impl_deserialize_num_method!(i16, visit_i16, from_i16); impl_deserialize_num_method!(i32, visit_i32, from_i32); impl_deserialize_num_method!(i64, visit_i64, from_i64); impl_deserialize_num_method!(usize, visit_usize, from_usize); impl_deserialize_num_method!(u8, visit_u8, from_u8); impl_deserialize_num_method!(u16, visit_u16, from_u16); impl_deserialize_num_method!(u32, visit_u32, from_u32); impl_deserialize_num_method!(u64, visit_u64, from_u64); impl_deserialize_num_method!(f32, visit_f32, from_f32); impl_deserialize_num_method!(f64, visit_f64, from_f64); } macro_rules! impl_deserialize_num { ($ty:ty) => { impl Deserialize for $ty { #[inline] fn deserialize(deserializer: &mut D) -> Result<$ty, D::Error> where D: Deserializer, { deserializer.visit(PrimitiveVisitor::new()) } } } } impl_deserialize_num!(isize); impl_deserialize_num!(i8); impl_deserialize_num!(i16); impl_deserialize_num!(i32); impl_deserialize_num!(i64); impl_deserialize_num!(usize); impl_deserialize_num!(u8); impl_deserialize_num!(u16); impl_deserialize_num!(u32); impl_deserialize_num!(u64); impl_deserialize_num!(f32); impl_deserialize_num!(f64); /////////////////////////////////////////////////////////////////////////////// struct CharVisitor; impl Visitor for CharVisitor { type Value = char; #[inline] fn visit_char(&mut self, v: char) -> Result where E: Error, { Ok(v) } #[inline] fn visit_str(&mut self, v: &str) -> Result where E: Error, { let mut iter = v.chars(); if let Some(v) = iter.next() { if iter.next().is_some() { Err(Error::syntax_error()) } else { Ok(v) } } else { Err(Error::end_of_stream_error()) } } } impl Deserialize for char { #[inline] fn deserialize(deserializer: &mut D) -> Result where D: Deserializer, { deserializer.visit(CharVisitor) } } /////////////////////////////////////////////////////////////////////////////// struct StringVisitor; impl Visitor for StringVisitor { type Value = String; fn visit_str(&mut self, v: &str) -> Result where E: Error, { Ok(v.to_string()) } fn visit_string(&mut self, v: String) -> Result where E: Error, { Ok(v) } } impl Deserialize for String { fn deserialize(deserializer: &mut D) -> Result where D: Deserializer, { deserializer.visit(StringVisitor) } } /////////////////////////////////////////////////////////////////////////////// struct OptionVisitor { marker: PhantomData, } impl< T: Deserialize, > Visitor for OptionVisitor { type Value = Option; #[inline] fn visit_none(&mut self) -> Result, E> where E: Error, { Ok(None) } #[inline] fn visit_some(&mut self, deserializer: &mut D) -> Result, D::Error> where D: Deserializer, { Ok(Some(try!(Deserialize::deserialize(deserializer)))) } } impl Deserialize for Option where T: Deserialize { fn deserialize(deserializer: &mut D) -> Result, D::Error> where D: Deserializer, { deserializer.visit_option(OptionVisitor { marker: PhantomData }) } } /////////////////////////////////////////////////////////////////////////////// pub struct VecVisitor { marker: PhantomData, } impl VecVisitor { pub fn new() -> Self { VecVisitor { marker: PhantomData, } } } impl Visitor for VecVisitor where T: Deserialize { type Value = Vec; #[inline] fn visit_unit(&mut self) -> Result, E> where E: Error, { Ok(vec![]) } #[inline] fn visit_seq(&mut self, mut visitor: V) -> Result, V::Error> where V: SeqVisitor, { let (len, _) = visitor.size_hint(); let mut values = Vec::with_capacity(len); while let Some(value) = try!(visitor.visit()) { values.push(value); } try!(visitor.end()); Ok(values) } } impl Deserialize for Vec { fn deserialize(deserializer: &mut D) -> Result, D::Error> where D: Deserializer, { deserializer.visit(VecVisitor::new()) } } /////////////////////////////////////////////////////////////////////////////// macro_rules! tuple_impls { () => {}; ($($visitor:ident => ($($name:ident),+),)+) => { $( struct $visitor<$($name,)+> { marker: PhantomData<($($name,)+)>, } impl< $($name: Deserialize,)+ > Visitor for $visitor<$($name,)+> { type Value = ($($name,)+); #[inline] #[allow(non_snake_case)] fn visit_seq(&mut self, mut visitor: V) -> Result<($($name,)+), V::Error> where V: SeqVisitor, { $( let $name = match try!(visitor.visit()) { Some(value) => value, None => { return Err(Error::end_of_stream_error()); } }; )+; try!(visitor.end()); Ok(($($name,)+)) } } impl< $($name: Deserialize),+ > Deserialize for ($($name,)+) { #[inline] fn deserialize(deserializer: &mut D) -> Result<($($name,)+), D::Error> where D: Deserializer, { deserializer.visit($visitor { marker: PhantomData }) } } )+ } } tuple_impls! { TupleVisitor1 => (T0), TupleVisitor2 => (T0, T1), TupleVisitor3 => (T0, T1, T2), TupleVisitor4 => (T0, T1, T2, T3), TupleVisitor5 => (T0, T1, T2, T3, T4), TupleVisitor6 => (T0, T1, T2, T3, T4, T5), TupleVisitor7 => (T0, T1, T2, T3, T4, T5, T6), TupleVisitor8 => (T0, T1, T2, T3, T4, T5, T6, T7), TupleVisitor9 => (T0, T1, T2, T3, T4, T5, T6, T7, T8), TupleVisitor10 => (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9), TupleVisitor11 => (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10), TupleVisitor12 => (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11), } /////////////////////////////////////////////////////////////////////////////// pub struct HashMapVisitor { marker: PhantomData>, } impl HashMapVisitor { #[inline] pub fn new() -> Self { HashMapVisitor { marker: PhantomData, } } } impl Visitor for HashMapVisitor where K: Deserialize + Eq + Hash, V: Deserialize, { type Value = HashMap; #[inline] fn visit_unit(&mut self) -> Result, E> where E: Error, { Ok(HashMap::new()) } #[inline] fn visit_map(&mut self, mut visitor: V_) -> Result, V_::Error> where V_: MapVisitor, { let (len, _) = visitor.size_hint(); let mut values = HashMap::with_capacity(len); while let Some((key, value)) = try!(visitor.visit()) { values.insert(key, value); } try!(visitor.end()); Ok(values) } } impl Deserialize for HashMap where K: Deserialize + Eq + Hash, V: Deserialize, { fn deserialize(deserializer: &mut D) -> Result, D::Error> where D: Deserializer, { deserializer.visit(HashMapVisitor::new()) } } /////////////////////////////////////////////////////////////////////////////// pub struct BTreeMapVisitor { marker: PhantomData>, } impl BTreeMapVisitor { #[inline] pub fn new() -> Self { BTreeMapVisitor { marker: PhantomData, } } } impl Visitor for BTreeMapVisitor where K: Deserialize + Ord, V: Deserialize { type Value = BTreeMap; #[inline] fn visit_unit(&mut self) -> Result, E> where E: Error, { Ok(BTreeMap::new()) } #[inline] fn visit_map(&mut self, mut visitor: Visitor) -> Result, Visitor::Error> where Visitor: MapVisitor, { let mut values = BTreeMap::new(); while let Some((key, value)) = try!(visitor.visit()) { values.insert(key, value); } try!(visitor.end()); Ok(values) } } impl< K: Deserialize + Eq + Ord, V: Deserialize, > Deserialize for BTreeMap { fn deserialize(deserializer: &mut D) -> Result, D::Error> where D: Deserializer, { deserializer.visit(BTreeMapVisitor::new()) } } /////////////////////////////////////////////////////////////////////////////// struct PathBufVisitor; impl Visitor for PathBufVisitor { type Value = path::PathBuf; fn visit_str(&mut self, v: &str) -> Result where E: Error, { Ok(path::PathBuf::new(&v)) } fn visit_string(&mut self, v: String) -> Result where E: Error, { self.visit_str(&v) } } impl Deserialize for path::PathBuf { fn deserialize(deserializer: &mut D) -> Result where D: Deserializer, { deserializer.visit(PathBufVisitor) } }