use std::collections::{HashMap, TreeMap}; use std::hash::Hash; /////////////////////////////////////////////////////////////////////////////// trait Deserialize { fn deserialize(d: &mut D) -> Result; } /////////////////////////////////////////////////////////////////////////////// trait Deserializer { fn deserialize>(&mut self) -> Result; } /////////////////////////////////////////////////////////////////////////////// trait DeserializerState { fn syntax_error(&mut self) -> E; fn visit< V: Visitor, T: Deserialize, >(&mut self, visitor: &mut V) -> Result; } trait Visitor< T, D: DeserializerState, 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_string(&mut self, d: &mut D, _v: String) -> 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()) } } 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) } } /////////////////////////////////////////////////////////////////////////////// impl< D: DeserializerState, E, > Deserialize for int { fn deserialize(d: &mut D) -> Result { struct Visitor; impl< D: DeserializerState, E, > ::Visitor for Visitor { fn visit_int(&mut self, _d: &mut D, v: int) -> Result { Ok(v) } } d.visit(&mut Visitor) } } impl< D: DeserializerState, E, > Deserialize for String { fn deserialize(d: &mut D) -> Result { struct Visitor; impl< D: DeserializerState, E, > ::Visitor for Visitor { fn visit_string(&mut self, _d: &mut D, v: String) -> Result { Ok(v) } } d.visit(&mut Visitor) } } /////////////////////////////////////////////////////////////////////////////// impl< T: Deserialize, D: DeserializerState, E, > Deserialize for Vec { fn deserialize(d: &mut D) -> Result, E> { struct Visitor; impl< T: Deserialize, D: DeserializerState, E, > ::Visitor, D, E> for Visitor { fn visit_seq< Visitor: SeqVisitor, >(&mut self, d: &mut D, mut visitor: Visitor) -> Result, E> { let (len, _) = visitor.size_hint(); let mut values = Vec::with_capacity(len); loop { match visitor.next(d) { 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, > ::Visitor<(), 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 > ::Visitor<(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, > ::Visitor, 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 { match visitor.next(d) { 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, > ::Visitor, 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 { match visitor.next(d) { Some(Ok((key, value))) => { values.insert(key, value); } Some(Err(err)) => { return Err(err); } None => { break; } } } Ok(values) } } d.visit(&mut Visitor) } } /////////////////////////////////////////////////////////////////////////////// mod json { use std::collections::TreeMap; #[deriving(Show)] pub enum Value { Null, Bool(bool), Int(int), String(String), Vec(Vec), Map(TreeMap), } impl< D: super::DeserializerState, E, > super::Deserialize for Value { fn deserialize(d: &mut D) -> Result { struct Visitor; impl< D: super::DeserializerState, E, > super::Visitor for Visitor { fn visit_null(&mut self, _d: &mut D) -> Result { Ok(Null) } fn visit_int(&mut self, _d: &mut D, v: int) -> Result { Ok(Int(v)) } fn visit_string(&mut self, _d: &mut D, v: String) -> Result { Ok(String(v)) } fn visit_seq< Visitor: ::SeqVisitor, >(&mut self, d: &mut D, mut visitor: Visitor) -> Result { let (len, _) = visitor.size_hint(); let mut values = Vec::with_capacity(len); loop { match visitor.next(d) { Some(Ok(value)) => { values.push(value); } Some(Err(err)) => { return Err(err); } None => { break; } } } Ok(Vec(values)) } fn visit_map< Visitor: ::MapVisitor, >(&mut self, d: &mut D, mut visitor: Visitor) -> Result { let mut values = TreeMap::new(); loop { match visitor.next(d) { Some(Ok((key, value))) => { values.insert(key, value); } Some(Err(err)) => { return Err(err); } None => { break; } } } Ok(Map(values)) } } d.visit(&mut Visitor) } } } /////////////////////////////////////////////////////////////////////////////// enum Token { Null, Int(int), String(String), SeqStart(uint), MapStart(uint), End, } /////////////////////////////////////////////////////////////////////////////// struct MyDeserializer { tokens: Iter, peeked: Option, } impl> MyDeserializer { fn new(tokens: Iter) -> MyDeserializer { MyDeserializer { tokens: tokens, peeked: None, } } fn next(&mut self) -> Option { match self.peeked.take() { Some(token) => { return Some(token); } None => { } } self.tokens.next() } fn peek<'a>(&'a mut self) -> Option<&'a Token> { match self.peeked { Some(_) => { } None => { self.peeked = self.tokens.next(); } } self.peeked.as_ref() } } impl< Iter: Iterator, > DeserializerState< (), > for MyDeserializer { fn syntax_error(&mut self) -> () { () } fn visit< V: Visitor, ()>, T: Deserialize, ()>, >(&mut self, visitor: &mut V) -> Result { match self.next() { Some(Null) => { visitor.visit_null(self) } Some(Int(v)) => { visitor.visit_int(self, v) } Some(String(v)) => { visitor.visit_string(self, v) } Some(SeqStart(len)) => { visitor.visit_seq(self, MySeqVisitor { len: len }) } Some(MapStart(len)) => { visitor.visit_map(self, MyMapVisitor { len: len }) } Some(End) => { Err(()) } None => { Err(()) } } } } struct MySeqVisitor { len: uint, } impl< Iter: Iterator, > SeqVisitor, ()> for MySeqVisitor { fn next< T: Deserialize, ()>, >(&mut self, d: &mut MyDeserializer) -> Option> { match d.peek() { Some(&End) => { d.next(); None } Some(_) => { self.len -= 1; Some(Deserialize::deserialize(d)) } None => { Some(Err(d.syntax_error())) } } } fn size_hint(&self) -> (uint, Option) { (self.len, Some(self.len)) } } struct MyMapVisitor { len: uint, } impl< Iter: Iterator, > MapVisitor, ()> for MyMapVisitor { fn next< K: Deserialize, ()>, V: Deserialize, ()>, >(&mut self, d: &mut MyDeserializer) -> Option> { match d.peek() { Some(&End) => { d.next(); None } Some(_) => { self.len -= 1; let key = match Deserialize::deserialize(d) { Ok(key) => key, Err(err) => { return Some(Err(err)); } }; let value = match Deserialize::deserialize(d) { Ok(value) => value, Err(err) => { return Some(Err(err)); } }; Some(Ok((key, value))) } None => { Some(Err(d.syntax_error())) } } } fn size_hint(&self) -> (uint, Option) { (self.len, Some(self.len)) } } /////////////////////////////////////////////////////////////////////////////// fn main() { let tokens = vec!( SeqStart(2), Int(1), Int(2), End ); let mut state = MyDeserializer::new(tokens.move_iter()); let v: Result, ()> = Deserialize::deserialize(&mut state); println!("{}", v); //// let tokens = vec!( SeqStart(2), Int(1), Int(2), End ); let mut state = MyDeserializer::new(tokens.move_iter()); let v: Result<(int, int), ()> = Deserialize::deserialize(&mut state); println!("{}", v); //// let tokens = vec!( SeqStart(2), Int(1), Int(2), End ); let mut state = MyDeserializer::new(tokens.move_iter()); let v: Result = Deserialize::deserialize(&mut state); println!("{}", v); //// let tokens = vec!( MapStart(2), String("a".to_string()), Int(1), String("b".to_string()), Int(2), End ); let mut state = MyDeserializer::new(tokens.move_iter()); let v: Result, ()> = Deserialize::deserialize(&mut state); println!("{}", v); //// let tokens = vec!( MapStart(2), String("a".to_string()), Int(1), String("b".to_string()), Int(2), End ); let mut state = MyDeserializer::new(tokens.move_iter()); let v: Result = Deserialize::deserialize(&mut state); println!("{}", v); }