use std::collections::{HashMap, TreeMap}; use std::hash::Hash; /////////////////////////////////////////////////////////////////////////////// pub trait Deserialize { fn deserialize(state: &mut S) -> Result; } pub trait Deserializer { fn visit< R, V: Visitor, >(&mut self, visitor: &mut V) -> Result; fn visit_option< R, V: Visitor, >(&mut self, visitor: &mut V) -> Result { self.visit(visitor) } fn syntax_error(&mut self) -> E; fn end_of_stream_error(&mut self) -> E; } pub trait Visitor, R, E> { fn visit_null(&mut self, state: &mut S) -> Result { Err(state.syntax_error()) } fn visit_bool(&mut self, state: &mut S, _v: bool) -> Result { Err(state.syntax_error()) } fn visit_int(&mut self, state: &mut S, v: int) -> Result { self.visit_i64(state, v as i64) } fn visit_i8(&mut self, state: &mut S, v: i8) -> Result { self.visit_i64(state, v as i64) } fn visit_i16(&mut self, state: &mut S, v: i16) -> Result { self.visit_i64(state, v as i64) } fn visit_i32(&mut self, state: &mut S, v: i32) -> Result { self.visit_i64(state, v as i64) } fn visit_i64(&mut self, state: &mut S, _v: i64) -> Result { Err(state.syntax_error()) } fn visit_uint(&mut self, state: &mut S, v: uint) -> Result { self.visit_u64(state, v as u64) } fn visit_u8(&mut self, state: &mut S, v: u8) -> Result { self.visit_u64(state, v as u64) } fn visit_u16(&mut self, state: &mut S, v: u16) -> Result { self.visit_u64(state, v as u64) } fn visit_u32(&mut self, state: &mut S, v: u32) -> Result { self.visit_u64(state, v as u64) } fn visit_u64(&mut self, state: &mut S, _v: u64) -> Result { Err(state.syntax_error()) } fn visit_f32(&mut self, state: &mut S, v: f32) -> Result { self.visit_f64(state, v as f64) } fn visit_f64(&mut self, state: &mut S, _v: f64) -> Result { Err(state.syntax_error()) } fn visit_str(&mut self, state: &mut S, _v: &str) -> Result { Err(state.syntax_error()) } fn visit_string(&mut self, state: &mut S, v: String) -> Result { self.visit_str(state, v.as_slice()) } fn visit_option< V: OptionVisitor, >(&mut self, state: &mut S, _visitor: V) -> Result { Err(state.syntax_error()) } fn visit_seq< V: SeqVisitor, >(&mut self, state: &mut S, _visitor: V) -> Result { Err(state.syntax_error()) } fn visit_map< V: MapVisitor, >(&mut self, state: &mut S, _visitor: V) -> Result { Err(state.syntax_error()) } } pub trait OptionVisitor { fn visit< T: Deserialize, >(&mut self, state: &mut S) -> Result, E>; } pub trait SeqVisitor { fn visit< T: Deserialize, >(&mut self, state: &mut S) -> Result, E>; fn end(&mut self, state: &mut S) -> Result<(), E>; #[inline] fn size_hint(&self, _state: &mut S) -> (uint, Option) { (0, None) } } pub trait MapVisitor { fn visit< K: Deserialize, V: Deserialize, >(&mut self, state: &mut S) -> Result, E> { match try!(self.visit_key(state)) { Some(key) => { let value = try!(self.visit_value(state)); Ok(Some((key, value))) } None => Ok(None) } } fn visit_key< K: Deserialize, >(&mut self, state: &mut S) -> Result, E>; fn visit_value< V: Deserialize, >(&mut self, state: &mut S) -> Result; fn end(&mut self, state: &mut S) -> Result<(), E>; #[inline] fn size_hint(&self, _state: &mut S) -> (uint, Option) { (0, None) } } /////////////////////////////////////////////////////////////////////////////// impl< S: Deserializer, E, > Deserialize for () { fn deserialize(state: &mut S) -> Result<(), E> { struct Visitor; impl, E> self::Visitor for Visitor { fn visit_null(&mut self, _state: &mut S) -> Result<(), E> { Ok(()) } fn visit_seq< V: SeqVisitor, >(&mut self, state: &mut S, mut visitor: V) -> Result<(), E> { try!(visitor.end(state)); Ok(()) } } state.visit(&mut Visitor) } } /////////////////////////////////////////////////////////////////////////////// impl< S: Deserializer, E, > Deserialize for bool { fn deserialize(state: &mut S) -> Result { struct Visitor; impl, E> self::Visitor for Visitor { fn visit_bool(&mut self, _state: &mut S, v: bool) -> Result { Ok(v) } } state.visit(&mut Visitor) } } /////////////////////////////////////////////////////////////////////////////// macro_rules! impl_deserialize_num_method { ($src_ty:ty, $method:ident, $from_method:ident) => { fn $method(&mut self, state: &mut S, v: $src_ty) -> Result { match FromPrimitive::$from_method(v) { Some(v) => Ok(v), None => Err(state.syntax_error()), } } } } #[inline] pub fn deserialize_from_primitive< S: Deserializer, E, T: Deserialize + FromPrimitive >(state: &mut S) -> Result { struct Visitor; impl< S: Deserializer, E, T: Deserialize + FromPrimitive > self::Visitor for Visitor { impl_deserialize_num_method!(int, visit_int, from_int) 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!(uint, visit_uint, from_uint) 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) } state.visit(&mut Visitor) } macro_rules! impl_deserialize_num { ($ty:ty) => { impl, E> Deserialize for $ty { #[inline] fn deserialize(state: &mut S) -> Result<$ty, E> { deserialize_from_primitive(state) } } } } impl_deserialize_num!(int) impl_deserialize_num!(i8) impl_deserialize_num!(i16) impl_deserialize_num!(i32) impl_deserialize_num!(i64) impl_deserialize_num!(uint) impl_deserialize_num!(u8) impl_deserialize_num!(u16) impl_deserialize_num!(u32) impl_deserialize_num!(u64) impl_deserialize_num!(f32) impl_deserialize_num!(f64) /////////////////////////////////////////////////////////////////////////////// impl< S: Deserializer, E, > Deserialize for String { fn deserialize(state: &mut S) -> Result { struct Visitor; impl, E> self::Visitor for Visitor { fn visit_str(&mut self, _state: &mut S, v: &str) -> Result { Ok(v.to_string()) } fn visit_string(&mut self, _state: &mut S, v: String) -> Result { Ok(v) } } state.visit(&mut Visitor) } } /////////////////////////////////////////////////////////////////////////////// impl< T: Deserialize, S: Deserializer, E, > Deserialize for Option { fn deserialize(state: &mut S) -> Result, E> { struct Visitor; impl< T: Deserialize, S: Deserializer, E, > self::Visitor, E> for Visitor { fn visit_option< V: OptionVisitor, >(&mut self, state: &mut S, mut visitor: V) -> Result, E> { visitor.visit(state) } } state.visit_option(&mut Visitor) } } /////////////////////////////////////////////////////////////////////////////// impl< T: Deserialize, S: Deserializer, E, > Deserialize for Vec { fn deserialize(state: &mut S) -> Result, E> { struct Visitor; impl< T: Deserialize, S: Deserializer, E, > self::Visitor, E> for Visitor { fn visit_seq< V: SeqVisitor, >(&mut self, state: &mut S, mut visitor: V) -> Result, E> { let (len, _) = visitor.size_hint(state); let mut values = Vec::with_capacity(len); loop { match try!(visitor.visit(state)) { Some(value) => { values.push(value); } None => { break; } } } Ok(values) } } state.visit(&mut Visitor) } } /////////////////////////////////////////////////////////////////////////////// macro_rules! peel { ($name:ident, $($other:ident,)*) => { impl_deserialize_tuple!($($other,)*) } } macro_rules! impl_deserialize_tuple { () => {}; ( $($name:ident,)+ ) => { peel!($($name,)*) impl< S: Deserializer, E, $($name: Deserialize),+ > Deserialize for ($($name,)+) { #[inline] #[allow(non_snake_case)] fn deserialize(state: &mut S) -> Result<($($name,)+), E> { struct Visitor; impl< S: Deserializer, E, $($name: Deserialize,)+ > self::Visitor for Visitor { fn visit_seq< V: SeqVisitor, >(&mut self, state: &mut S, mut visitor: V) -> Result<($($name,)+), E> { $( let $name = match try!(visitor.visit(state)) { Some(value) => value, None => { return Err(state.end_of_stream_error()); } }; )+; try!(visitor.end(state)); Ok(($($name,)+)) } } state.visit(&mut Visitor) } } } } impl_deserialize_tuple! { T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, } /////////////////////////////////////////////////////////////////////////////// impl< K: Deserialize + Eq + Hash, V: Deserialize, S: Deserializer, E, > Deserialize for HashMap { fn deserialize(state: &mut S) -> Result, E> { struct Visitor; impl< K: Deserialize + Eq + Hash, V: Deserialize, S: Deserializer, E, > self::Visitor, E> for Visitor { fn visit_map< Visitor: MapVisitor, >(&mut self, state: &mut S, mut visitor: Visitor) -> Result, E> { let (len, _) = visitor.size_hint(state); let mut values = HashMap::with_capacity(len); loop { match try!(visitor.visit(state)) { Some((key, value)) => { values.insert(key, value); } None => { break; } } } Ok(values) } } state.visit(&mut Visitor) } } impl< K: Deserialize + Eq + Ord, V: Deserialize, S: Deserializer, E, > Deserialize for TreeMap { fn deserialize(state: &mut S) -> Result, E> { struct Visitor; impl< K: Deserialize + Eq + Ord, V: Deserialize, S: Deserializer, E, > self::Visitor, E> for Visitor { fn visit_map< Visitor: MapVisitor, >(&mut self, state: &mut S, mut visitor: Visitor) -> Result, E> { let mut values = TreeMap::new(); loop { match try!(visitor.visit(state)) { Some((key, value)) => { values.insert(key, value); } None => { break; } } } Ok(values) } } state.visit(&mut Visitor) } }