diff --git a/serde2/Cargo.toml b/serde2/Cargo.toml index 73aa2281..9001c6bd 100644 --- a/serde2/Cargo.toml +++ b/serde2/Cargo.toml @@ -6,9 +6,9 @@ authors = ["Erick Tryzelaar "] [lib] name = "serde2" -#[[bin]] -#name = "serde2" -#path = "src/bin.rs" +[[bin]] +name = "serde2" +path = "src/bin.rs" [dependencies.serde2_macros] path = "serde2_macros/" diff --git a/serde2/src/bin.rs b/serde2/src/bin.rs index c5383fdb..b5d95d1f 100644 --- a/serde2/src/bin.rs +++ b/serde2/src/bin.rs @@ -1,5 +1,339 @@ extern crate serde2; +use serde2::de2; +use serde2::de2::{Deserialize, Deserializer}; + +enum Token { + //Null, + Int(int), + //String(String), + SeqStart(uint), + //MapStart(uint), + End, +} + +#[deriving(Show)] +enum Error { + SyntaxError, + EndOfStreamError, +} + +/////////////////////////////////////////////////////////////////////////////// + +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> Deserializer for MyDeserializer { + fn visit< + R, + V: de2::Visitor, R, Error>, + >(&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(self.syntax_error()) + } + None => { + Err(self.end_of_stream_error()) + } + } + } + + fn syntax_error(&mut self) -> Error { + SyntaxError + } + + fn end_of_stream_error(&mut self) -> Error { + EndOfStreamError + } +} + +struct MySeqVisitor { + len: uint, +} + +impl< + Iter: Iterator, +> de2::SeqVisitor, Error> for MySeqVisitor { + fn next< + T: Deserialize, Error> + >(&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 end(&mut self, d: &mut MyDeserializer) -> Result<(), Error> { + match d.next() { + Some(End) => Ok(()), + Some(_) => Err(d.syntax_error()), + None => Err(d.end_of_stream_error()), + } + } + + fn size_hint(&self, _d: &mut MyDeserializer) -> (uint, Option) { + (self.len, Some(self.len)) + } +} + +/* +struct MyMapVisitor { + len: uint, +} + +impl< + Iter: Iterator, +> Visitor, ()> for MyMapVisitor { + fn next(&mut self, d: &mut MyDeserializer) -> Option> { + match d.peek() { + Some(&End) => { + d.next(); + None + } + Some(_) => { + self.len -= 1; + Some(d.visit_map_elt()) + } + None => { + Some(Err(d.syntax_error())) + } + } + } + + fn size_hint(&self) -> (uint, Option) { + (self.len, Some(self.len)) + } +} +*/ + +/////////////////////////////////////////////////////////////////////////////// + +mod json { + //use std::collections::TreeMap; + use serde2::de2; + + #[deriving(Show)] + pub enum Value { + //Null, + //Bool(bool), + Int(int), + //String(String), + List(Vec), + //Map(TreeMap), + } + + impl< + D: de2::Deserializer, + E, + > de2::Deserialize for Value { + fn deserialize(d: &mut D) -> Result { + struct Visitor; + + impl< + D: de2::Deserializer, + E, + > de2::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: de2::SeqVisitor, + >(&mut self, d: &mut D, mut visitor: Visitor) -> Result { + let (len, _) = visitor.size_hint(d); + let mut values = Vec::with_capacity(len); + + loop { + match visitor.next(d) { + Some(value) => { + values.push(try!(value)); + } + None => { + break; + } + } + } + + Ok(List(values)) + } + + /* + fn visit_map< + Visitor: ::MapVisitor, + >(&mut self, d: &mut D, mut visitor: Visitor) -> Result { + 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(Map(values)) + } + */ + } + + d.visit(&mut Visitor) + } + } +} + +/////////////////////////////////////////////////////////////////////////////// + +fn main() { + let tokens = vec!( + SeqStart(2), + Int(1), + Int(2), + End + ); + let mut state = MyDeserializer::new(tokens.into_iter()); + + let v: Result, Error> = Deserialize::deserialize(&mut state); + println!("{}", v); + + //// + + let tokens = vec!( + SeqStart(2), + Int(1), + Int(2), + End + ); + let mut state = MyDeserializer::new(tokens.into_iter()); + + let v: Result<(int, int), Error> = Deserialize::deserialize(&mut state); + println!("{}", v); + + //// + + let tokens = vec!( + SeqStart(2), + Int(1), + Int(2), + End + ); + let mut state = MyDeserializer::new(tokens.into_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.into_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.into_iter()); + + let v: Result = Deserialize::deserialize(&mut state); + println!("{}", v); + */ +} + + +/* use std::collections::TreeMap; use serde2::{Serialize, GatherTokens}; use serde2::json; @@ -117,3 +451,4 @@ fn main() { println!("json: {}", json::to_string(&value).unwrap().unwrap()); println!(""); } +*/ diff --git a/serde2/src/de2.rs b/serde2/src/de2.rs index 867cf85c..6a535ec5 100644 --- a/serde2/src/de2.rs +++ b/serde2/src/de2.rs @@ -1,16 +1,177 @@ -use std::collections::{HashMap, TreeMap}; -use std::hash::Hash; +//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 syntax_error(&mut self) -> E; + + fn end_of_stream_error(&mut self) -> E; +} + +pub trait Visitor, R, E> { + fn visit_int(&mut self, d: &mut D, _v: int) -> Result { + Err(d.syntax_error()) + } + + fn visit_seq< + V: SeqVisitor + >(&mut self, d: &mut D, _v: V) -> Result { + Err(d.syntax_error()) + } +} + +pub trait SeqVisitor { + fn next< + T: Deserialize, + >(&mut self, d: &mut D) -> Option>; + + 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 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< + 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 visitor.next(d) { + Some(Ok(value)) => { + values.push(value); + } + Some(Err(err)) => { + return Err(err); + } + 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 visitor.next(d) { + Some(value) => { + t0 = Some(try!(value)); + } + None => { + return Err(d.end_of_stream_error()); + } + } + } + 1 => { + state += 1; + match visitor.next(d) { + Some(value) => { + t1 = Some(try!(value)); + } + None => { + return Err(d.end_of_stream_error()); + } + } + } + _ => { + try!(visitor.end(d)); + + return Ok((t0.unwrap(), t1.unwrap())); + } + } + } + } + } + + d.visit(&mut Visitor) + } +} + + + +/* trait Deserialize { fn deserialize(state: &mut S) -> Result; } /////////////////////////////////////////////////////////////////////////////// -trait Deserializer { - fn visit(&mut self, state: &mut S) -> Result; +trait Deserializer { + fn visit(&mut self, state: &mut S) -> Result; fn syntax_error(&mut self) -> E; } @@ -26,30 +187,78 @@ trait DeserializerState { T: Deserialize, >(&mut self, visitor: &mut V) -> Result; } + +trait Visitor { + fn visit(&mut self, state: &mut S) -> Result; + + fn size_hint(&self) -> (uint, Option); +} */ -trait Visitor { - fn visit(&mut self, state: &mut S) -> R; -} - trait VisitorState< - D: Deserializer, - R, + D: Deserializer, + //R, E, > { /* fn visit_null(&mut self) -> R; */ - fn visit_int(&mut self, d: &mut D, _v: int) -> Result; + fn visit_int(&mut self, d: &mut D, v: int) -> Result { + Err(d.syntax_error()) + //self.visit_i64(d, v as i64) + } /* - fn visit_string(&mut self, _v: String) -> R; + fn visit_i8(&mut self, d: &mut D, v: i8) -> Result { + self.visit_i64(d, v as i64) + } + + fn visit_i16(&mut self, d: &mut D, v: i16) -> Result { + self.visit_i64(d, v as i64) + } + + fn visit_i32(&mut self, d: &mut D, v: i32) -> Result { + self.visit_i64(d, v as i64) + } + + fn visit_i64(&mut self, d: &mut D, v: i64) -> Result { + Err(d.syntax_error()) + } + + fn visit_uint(&mut self, d: &mut D, v: int) -> Result { + self.visit_u64(d, v as u64) + } + + fn visit_u8(&mut self, d: &mut D, v: u8) -> Result { + self.visit_u64(d, v as u64) + } + + fn visit_u16(&mut self, d: &mut D, v: u16) -> Result { + self.visit_u64(d, v as u64) + } + + fn visit_u32(&mut self, d: &mut D, v: u32) -> Result { + self.visit_u64(d, v as u64) + } + + fn visit_u64(&mut self, d: &mut D, _v: u64) -> Result { + Err(d.syntax_error()) + } + + fn visit_string(&mut self, d: &mut D, _v: String) -> Result { + Err(d.syntax_error()) + } + */ fn visit_seq< - V: Visitor, - >(&mut self, _visitor: V) -> R; + R, + V: SeqVisitor, + >(&mut self, d: &mut D, _visitor: V) -> Result { + Err(d.syntax_error()) + } + /* /* #[inline] fn visit_named_seq< @@ -89,6 +298,17 @@ trait VisitorState< */ } +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< @@ -105,18 +325,48 @@ trait MapVisitor { /////////////////////////////////////////////////////////////////////////////// +/* +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< - S: Deserializer, + D: Deserializer, E, -> Deserialize for int { - fn deserialize(state: &mut S) -> Result { +> Deserialize for int { + fn deserialize(state: &mut D) -> Result { struct Visitor; impl< - D: Deserializer, + D: Deserializer, E, - > VisitorState for Visitor { - fn visit_int(&mut self, d: &mut D, v: int) -> Result { + > VisitorState for Visitor { + fn visit_int(&mut self, _state: &mut D, v: int) -> Result { Ok(v) } } @@ -125,51 +375,52 @@ impl< } } - /* impl< - D: DeserializerState, + S: Deserializer, E, -> Deserialize for String { - fn deserialize(d: &mut D) -> Result { +> Deserialize for String { + fn deserialize(state: &mut S) -> Result { struct Visitor; impl< - D: DeserializerState, + D: Deserializer, E, - > ::VisitorState for Visitor { + > VisitorState for Visitor { fn visit_string(&mut self, _d: &mut D, v: String) -> Result { Ok(v) } } - d.visit(&mut Visitor) + state.visit(&mut Visitor) } } +*/ /////////////////////////////////////////////////////////////////////////////// +/* impl< T: Deserialize, - D: DeserializerState, + D: Deserializer, E>, E, > Deserialize for Vec { fn deserialize(d: &mut D) -> Result, E> { struct Visitor; impl< + D: Deserializer, T: Deserialize, - D: DeserializerState, E, - > ::VisitorState, D, E> for Visitor { + > VisitorState for Visitor { fn visit_seq< - Visitor: ::Visitor, - >(&mut self, d: &mut D, mut visitor: Visitor) -> Result, E> { + 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(d) { + match visitor.next(state) { Some(Ok(value)) => { values.push(value); } @@ -189,6 +440,7 @@ impl< d.visit(&mut Visitor) } } +*/ /* /////////////////////////////////////////////////////////////////////////////// @@ -367,305 +619,8 @@ impl< /////////////////////////////////////////////////////////////////////////////// -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::VisitorState 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 { - 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(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: VisitorState, ()>, - 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, -> Visitor, ()> for MySeqVisitor { - fn next(&mut self, d: &mut MyDeserializer) -> Option> { - match d.peek() { - Some(&End) => { - d.next(); - None - } - Some(_) => { - self.len -= 1; - Some(d.visit_seq_elt()) - } - None => { - Some(Err(d.syntax_error())) - } - } - } - - fn size_hint(&self) -> (uint, Option) { - (self.len, Some(self.len)) - } -} - -struct MyMapVisitor { - len: uint, -} - -impl< - Iter: Iterator, -> Visitor, ()> for MyMapVisitor { - fn next(&mut self, d: &mut MyDeserializer) -> Option> { - match d.peek() { - Some(&End) => { - d.next(); - None - } - Some(_) => { - self.len -= 1; - Some(d.visit_map_elt()) - } - 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); -} */ */ -fn main() {} +/////////////////////////////////////////////////////////////////////////////// +