use std::collections::{HashMap, TreeMap}; use std::hash::Hash; /////////////////////////////////////////////////////////////////////////////// pub trait Deserialize { fn deserialize(d: &mut D) -> 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, d: &mut D) -> Result { Err(d.syntax_error()) } fn visit_int(&mut self, d: &mut D, _v: int) -> Result { Err(d.syntax_error()) } fn visit_str(&mut self, d: &mut D, v: &str) -> Result { self.visit_string(d, v.to_string()) } fn visit_string(&mut self, d: &mut D, _v: String) -> Result { Err(d.syntax_error()) } fn visit_option< V: OptionVisitor, >(&mut self, d: &mut D, _visitor: V) -> Result { Err(d.syntax_error()) } fn visit_seq< V: SeqVisitor, >(&mut self, d: &mut D, _visitor: V) -> Result { Err(d.syntax_error()) } fn visit_map< V: MapVisitor, >(&mut self, d: &mut D, _visitor: V) -> Result { Err(d.syntax_error()) } } pub trait OptionVisitor { fn visit< T: Deserialize, >(&mut self, d: &mut D) -> Result, E>; } pub trait SeqVisitor { fn visit< T: Deserialize, >(&mut self, d: &mut D) -> Result, E>; fn end(&mut self, d: &mut D) -> Result<(), E>; #[inline] fn size_hint(&self, _d: &mut D) -> (uint, Option) { (0, None) } } pub trait MapVisitor { fn visit< K: Deserialize, V: Deserialize, >(&mut self, d: &mut D) -> Result, E>; fn end(&mut self, d: &mut D) -> Result<(), E>; #[inline] fn size_hint(&self, _d: &mut D) -> (uint, Option) { (0, None) } } /////////////////////////////////////////////////////////////////////////////// impl< D: Deserializer, E, > Deserialize for () { fn deserialize(d: &mut D) -> Result<(), E> { struct Visitor; impl, E> self::Visitor for Visitor { fn visit_null(&mut self, _d: &mut D) -> Result<(), E> { Ok(()) } } d.visit(&mut Visitor) } } /////////////////////////////////////////////////////////////////////////////// impl< D: Deserializer, E, > Deserialize for int { fn deserialize(d: &mut D) -> Result { struct Visitor; impl, E> self::Visitor for Visitor { fn visit_int(&mut self, _d: &mut D, v: int) -> Result { Ok(v) } } d.visit(&mut Visitor) } } /////////////////////////////////////////////////////////////////////////////// impl< D: Deserializer, E, > Deserialize for String { fn deserialize(d: &mut D) -> Result { struct Visitor; impl, E> self::Visitor for Visitor { fn visit_string(&mut self, _d: &mut D, v: String) -> Result { Ok(v) } } d.visit(&mut Visitor) } } /////////////////////////////////////////////////////////////////////////////// impl< T: Deserialize, D: Deserializer, E, > Deserialize for Option { fn deserialize(d: &mut D) -> Result, E> { struct Visitor; impl< T: Deserialize, D: Deserializer, E, > self::Visitor, E> for Visitor { fn visit_option< V: OptionVisitor, >(&mut self, d: &mut D, mut visitor: V) -> Result, E> { visitor.visit(d) } } d.visit_option(&mut Visitor) } } /////////////////////////////////////////////////////////////////////////////// impl< T: Deserialize, D: Deserializer, E, > Deserialize for Vec { fn deserialize(d: &mut D) -> Result, E> { struct Visitor; impl< T: Deserialize, D: Deserializer, E, > self::Visitor, E> for Visitor { fn visit_seq< V: SeqVisitor, >(&mut self, d: &mut D, mut visitor: V) -> Result, E> { let (len, _) = visitor.size_hint(d); let mut values = Vec::with_capacity(len); loop { match try!(visitor.visit(d)) { Some(value) => { values.push(value); } None => { break; } } } Ok(values) } } d.visit(&mut Visitor) } } impl< T0: Deserialize, T1: Deserialize, D: Deserializer, E, > Deserialize for (T0, T1) { fn deserialize(d: &mut D) -> Result<(T0, T1), E> { struct Visitor; impl< T0: Deserialize, T1: Deserialize, D: Deserializer, E, > self::Visitor for Visitor { fn visit_seq< V: SeqVisitor, >(&mut self, d: &mut D, mut visitor: V) -> Result<(T0, T1), E> { let mut state = 0u; let mut t0 = None; let mut t1 = None; loop { match state { 0 => { state += 1; match try!(visitor.visit(d)) { Some(value) => { t0 = Some(value); } None => { return Err(d.end_of_stream_error()); } } } 1 => { state += 1; match try!(visitor.visit(d)) { Some(value) => { t1 = Some(value); } None => { return Err(d.end_of_stream_error()); } } } _ => { try!(visitor.end(d)); return Ok((t0.unwrap(), t1.unwrap())); } } } } } d.visit(&mut Visitor) } } /////////////////////////////////////////////////////////////////////////////// impl< K: Deserialize + Eq + Hash, V: Deserialize, D: Deserializer, E, > Deserialize for HashMap { fn deserialize(d: &mut D) -> Result, E> { struct Visitor; impl< K: Deserialize + Eq + Hash, V: Deserialize, D: Deserializer, E, > self::Visitor, E> for Visitor { fn visit_map< Visitor: MapVisitor, >(&mut self, d: &mut D, mut visitor: Visitor) -> Result, E> { let (len, _) = visitor.size_hint(d); let mut values = HashMap::with_capacity(len); loop { match try!(visitor.visit(d)) { Some((key, value)) => { values.insert(key, value); } None => { break; } } } Ok(values) } } d.visit(&mut Visitor) } } impl< K: Deserialize + Eq + Ord, V: Deserialize, D: Deserializer, E, > Deserialize for TreeMap { fn deserialize(d: &mut D) -> Result, E> { struct Visitor; impl< K: Deserialize + Eq + Ord, V: Deserialize, D: Deserializer, E, > self::Visitor, E> for Visitor { fn visit_map< Visitor: MapVisitor, >(&mut self, d: &mut D, mut visitor: Visitor) -> Result, E> { let mut values = TreeMap::new(); loop { match try!(visitor.visit(d)) { Some((key, value)) => { values.insert(key, value); } None => { break; } } } Ok(values) } } d.visit(&mut Visitor) } } /* trait Deserialize { fn deserialize(state: &mut S) -> Result; } /////////////////////////////////////////////////////////////////////////////// trait Deserializer { fn visit(&mut self, state: &mut S) -> Result<(), E>; fn syntax_error(&mut self) -> E; } /////////////////////////////////////////////////////////////////////////////// /* trait DeserializerState { fn syntax_error(&mut self) -> E; fn visit< V: VisitorState, T: Deserialize, >(&mut self, visitor: &mut V) -> Result; } trait Visitor { fn visit(&mut self, state: &mut S) -> Result<(), E>; fn size_hint(&self) -> (uint, Option); } */ trait VisitorState< D: Deserializer, //R, E, > { /* fn visit_null(&mut self) -> R; */ fn visit_int(&mut self, d: &mut D, v: int) -> Result { Err(d.syntax_error()) //self.visit_i64(d, v as i64) } /* fn visit_i8(&mut self, d: &mut D, v: i8) -> Result<(), E> { self.visit_i64(d, v as i64) } fn visit_i16(&mut self, d: &mut D, v: i16) -> Result<(), E> { self.visit_i64(d, v as i64) } fn visit_i32(&mut self, d: &mut D, v: i32) -> Result<(), E> { self.visit_i64(d, v as i64) } fn visit_i64(&mut self, d: &mut D, v: i64) -> Result<(), E> { Err(d.syntax_error()) } fn visit_uint(&mut self, d: &mut D, v: int) -> Result<(), E> { self.visit_u64(d, v as u64) } fn visit_u8(&mut self, d: &mut D, v: u8) -> Result<(), E> { self.visit_u64(d, v as u64) } fn visit_u16(&mut self, d: &mut D, v: u16) -> Result<(), E> { self.visit_u64(d, v as u64) } fn visit_u32(&mut self, d: &mut D, v: u32) -> Result<(), E> { self.visit_u64(d, v as u64) } fn visit_u64(&mut self, d: &mut D, _v: u64) -> Result<(), E> { Err(d.syntax_error()) } fn visit_string(&mut self, d: &mut D, _v: String) -> Result<(), E> { Err(d.syntax_error()) } */ fn visit_seq< R, V: SeqVisitor, >(&mut self, d: &mut D, _visitor: V) -> Result<(), E> { Err(d.syntax_error()) } /* /* #[inline] fn visit_named_seq< Elt: Deserialize, V: SeqVisitor>, >(&mut self, d: &mut D, _name: &str, visitor: V) -> Result { self.visit_seq(d, visitor) } */ fn visit_seq_elt< T: Deserialize, >(&mut self, first: bool, value: T) -> R; */ /* #[inline] fn visit_map< K: Deserialize, V: Deserialize, V: Visitor>, >(&mut self, d: &mut D, _visitor: V) -> Result { Err(d.syntax_error()) } #[inline] fn visit_named_map< V: Visitor, >(&mut self, d: &mut D, _name: &str, visitor: V) -> Result { self.visit_map(d, visitor) } fn visit_map_elt< K: Deserialize, V: Deserialize, >(&mut self, first: bool, value: T) -> Result<(K, V), E>; */ } trait SeqVisitor { fn next< T: Deserialize, >(&mut self, d: &mut D) -> Option>; #[inline] fn size_hint(&self) -> (uint, Option) { (0, None) } } /* trait MapVisitor { fn next< K: Deserialize, V: Deserialize, >(&mut self, d: &mut D) -> Option>; #[inline] fn size_hint(&self) -> (uint, Option) { (0, None) } } */ /////////////////////////////////////////////////////////////////////////////// /* macro_rules! impl_deserialize { ($ty:ty, $method:ident) => { impl< S: Deserializer, E, > Deserialize for $ty { #[inline] fn deserialize(state: &mut S) -> Result<$ty, E> { struct Visitor; impl< D: Deserializer<$ty, E>, E, > VisitorState for Visitor { fn visit_int(&mut self, _d: &mut D, v: int) -> Result<$ty, E> { Ok(v) } } state.visit(&mut Visitor) d.$method(token) } } } } */ impl< D: Deserializer, E, > Deserialize for int { fn deserialize(state: &mut D) -> Result { struct Visitor; impl< D: Deserializer, E, > VisitorState for Visitor { fn visit_int(&mut self, _state: &mut D, v: int) -> Result { Ok(v) } } state.visit(&mut Visitor) } } /* impl< S: Deserializer, E, > Deserialize for String { fn deserialize(state: &mut S) -> Result { struct Visitor; impl< D: Deserializer, E, > VisitorState for Visitor { fn visit_string(&mut self, _d: &mut D, v: String) -> Result { Ok(v) } } state.visit(&mut Visitor) } } */ /////////////////////////////////////////////////////////////////////////////// /* impl< T: Deserialize, D: Deserializer, E>, E, > Deserialize for Vec { fn deserialize(d: &mut D) -> Result, E> { struct Visitor; impl< D: Deserializer, T: Deserialize, E, > VisitorState for Visitor { fn visit_seq< V: SeqVisitor, >(&mut self, state: &mut D, mut visitor: V) -> Result, E> { let (len, _) = visitor.size_hint(); let mut values = Vec::with_capacity(len); loop { match visitor.next(state) { Some(Ok(value)) => { values.push(value); } Some(Err(err)) => { return Err(err); } None => { break; } } } Ok(values) } } d.visit(&mut Visitor) } } */ /* /////////////////////////////////////////////////////////////////////////////// impl< D: DeserializerState, E > Deserialize for () { fn deserialize(d: &mut D) -> Result<(), E> { struct Visitor; impl< D: DeserializerState, E, > ::VisitorState<(), D, E> for Visitor { fn visit_null(&mut self, _d: &mut D) -> Result<(), E> { Ok(()) } } d.visit(&mut Visitor) } } /////////////////////////////////////////////////////////////////////////////// impl< T0: Deserialize, T1: Deserialize, D: DeserializerState, E > Deserialize for (T0, T1) { fn deserialize(d: &mut D) -> Result<(T0, T1), E> { struct Visitor; impl< T0: Deserialize, T1: Deserialize, D: DeserializerState, E > ::VisitorState<(T0, T1), D, E> for Visitor { fn visit_seq< Visitor: ::SeqVisitor, >(&mut self, d: &mut D, mut visitor: Visitor) -> Result<(T0, T1), E> { let mut state = 0u; let mut t0 = None; let mut t1 = None; loop { match state { 0 => { t0 = match visitor.next(d) { Some(Ok(v)) => Some(v), Some(Err(err)) => { return Err(err); } None => { return Err(d.syntax_error()); } }; state += 1; } 1 => { t1 = match visitor.next(d) { Some(Ok(v)) => Some(v), Some(Err(err)) => { return Err(err); } None => { return Err(d.syntax_error()); } }; state += 1; } _ => { match visitor.next(d) { Some(Ok(())) => { return Err(d.syntax_error()); } Some(Err(err)) => { return Err(err); } None => { break; } } } } } match (t0, t1) { (Some(t0), Some(t1)) => Ok((t0, t1)), _ => Err(d.syntax_error()), } } } d.visit(&mut Visitor) } } /////////////////////////////////////////////////////////////////////////////// impl< K: Deserialize + Eq + Hash, V: Deserialize, D: DeserializerState, E > Deserialize for HashMap { fn deserialize(d: &mut D) -> Result, E> { struct Visitor; impl< K: Deserialize + Eq + Hash, V: Deserialize, D: DeserializerState, E, > ::VisitorState, D, E> for Visitor { fn visit_map< Visitor: ::MapVisitor, >(&mut self, d: &mut D, mut visitor: Visitor) -> Result, E> { let (len, _) = visitor.size_hint(); let mut values = HashMap::with_capacity(len); loop { let kv: Option> = visitor.next(d); match kv { Some(Ok((key, value))) => { values.insert(key, value); } Some(Err(err)) => { return Err(err); } None => { break; } } } Ok(values) } } d.visit(&mut Visitor) } } impl< K: Deserialize + Eq + Ord, V: Deserialize, D: DeserializerState, E > Deserialize for TreeMap { fn deserialize(d: &mut D) -> Result, E> { struct Visitor; impl< K: Deserialize + Eq + Ord, V: Deserialize, D: DeserializerState, E, > ::VisitorState, D, E> for Visitor { fn visit_map< Visitor: ::MapVisitor, >(&mut self, d: &mut D, mut visitor: Visitor) -> Result, E> { let mut values = TreeMap::new(); loop { let kv: Option> = visitor.next(d); match kv { Some(Ok((key, value))) => { values.insert(key, value); } Some(Err(err)) => { return Err(err); } None => { break; } } } Ok(values) } } d.visit(&mut Visitor) } } /////////////////////////////////////////////////////////////////////////////// */ */