diff --git a/serde2/src/de2.rs b/serde2/src/de2.rs index f37ade2c..8ef58d7d 100644 --- a/serde2/src/de2.rs +++ b/serde2/src/de2.rs @@ -10,19 +10,25 @@ trait Deserialize { /////////////////////////////////////////////////////////////////////////////// trait VisitorState { + fn visit< + V: Visitor, + Value, + SeqValue, + >(&mut self, visitor: &mut V) -> Result; + + fn visit_null(&mut self) -> Result<(), E>; + fn visit_int(&mut self) -> Result; fn visit_string(&mut self) -> Result; - fn visit_seq< - T: Deserialize, - V: Visitor - >(&mut self) -> Result; + fn visit_seq(&mut self) -> Result; fn visit_seq_elt< T: Deserialize, - >(&mut self) -> Result; + >(&mut self) -> Option>; + /* fn visit_map< T: Deserialize, V: Visitor @@ -32,8 +38,34 @@ trait VisitorState { K: Deserialize, V: Deserialize >(&mut self) -> Result<(K, V), E>; + */ } +trait Visitor { + fn visit_null(&mut self) -> Result; + + fn visit_int(&mut self, v: int) -> Result; + + fn visit_string(&mut self, v: String) -> Result; + + fn visit_seq(&mut self, len: uint) -> Result; + + fn visit_seq_elt(&mut self, values: &mut SeqValue, value: Value) -> Result<(), E>; + + fn visit_seq_end(&mut self, values: SeqValue) -> Result; +} + +/* +trait Visitor, E> { + fn next< + T: Deserialize, + >(&mut self) -> Option>; + + fn size_hint(&self) -> (uint, Option); +} +*/ + +/* trait Visitor { fn new(len: uint) -> Self; @@ -41,16 +73,23 @@ trait Visitor { fn unwrap(self) -> Result; } +*/ /////////////////////////////////////////////////////////////////////////////// -impl, E> Deserialize for int { +impl< + S: VisitorState, + E, +> Deserialize for int { fn deserialize(state: &mut S) -> Result { state.visit_int() } } -impl, E> Deserialize for String { +impl< + S: VisitorState, + E, +> Deserialize for String { fn deserialize(state: &mut S) -> Result { state.visit_string() } @@ -61,36 +100,33 @@ impl, E> Deserialize for String { impl< T: Deserialize, S: VisitorState, - E + E, > Deserialize for Vec { fn deserialize(state: &mut S) -> Result, E> { - struct Visitor { - value: Vec, - } + let len = try!(state.visit_seq()); + let mut value = Vec::with_capacity(len); - impl< - T: Deserialize, - S: VisitorState, - E - > ::Visitor, S, E> for Visitor { - fn new(len: uint) -> Visitor { - Visitor { - value: Vec::with_capacity(len), - } - } - - fn visit(&mut self, state: &mut S) -> Result<(), E> { - let value = try!(state.visit_seq_elt()); - self.value.push(value); - Ok(()) - } - - fn unwrap(self) -> Result, E> { - Ok(self.value) + loop { + match state.visit_seq_elt() { + Some(Ok(v)) => { value.push(v); } + Some(Err(err)) => { return Err(err); } + None => { break; } } } - state.visit_seq::, Visitor>() + Ok(value) + } +} + +/////////////////////////////////////////////////////////////////////////////// + + +impl< + S: VisitorState, + E +> Deserialize for () { + fn deserialize(state: &mut S) -> Result<(), E> { + state.visit_null() } } @@ -103,6 +139,29 @@ impl< E > Deserialize for (T0, T1) { fn deserialize(state: &mut S) -> Result<(T0, T1), E> { + let _ = try!(state.visit_seq()); + + let t0 = match state.visit_seq_elt() { + Some(Ok(v)) => v, + Some(Err(err)) => { return Err(err); } + None => { fail!(); } + }; + + let t1 = match state.visit_seq_elt() { + Some(Ok(v)) => v, + Some(Err(err)) => { return Err(err); } + None => { fail!(); } + }; + + match state.visit_seq_elt() { + Some(Ok(())) => { fail!(); } + Some(Err(err)) => { return Err(err); } + None => { } + } + + Ok((t0, t1)) + + /* struct Visitor { state: uint, t0: Option, @@ -155,9 +214,11 @@ impl< } state.visit_seq::<(T0, T1), Visitor>() + */ } } +/* /////////////////////////////////////////////////////////////////////////////// impl< @@ -197,6 +258,58 @@ impl< state.visit_map::, Visitor>() } } +*/ + +/////////////////////////////////////////////////////////////////////////////// + +mod json { + enum Value { + Null, + Bool(bool), + Int(int), + String(String), + Vec(Vec), + } + + impl< + S: super::VisitorState, + E + > super::Deserialize for Value { + fn deserialize(state: &mut S) -> Result { + struct Visitor; + + impl super::Visitor, E> for Visitor { + fn visit_null(&mut self) -> Result { + Ok(Null) + } + + fn visit_int(&mut self, v: int) -> Result { + Ok(Int(v)) + } + + fn visit_string(&mut self, v: String) -> Result { + Ok(String(v)) + } + + fn visit_seq(&mut self, len: uint) -> Result, E> { + Ok(Vec::with_capacity(len)) + } + + fn visit_seq_elt(&mut self, values: &mut Vec, value: Value) -> Result<(), E> { + values.push(value); + Ok(()) + } + + fn visit_seq_end(&mut self, values: Vec) -> Result { + Ok(Vec(values)) + } + } + + state.visit(&mut Visitor) + } + } + +} /////////////////////////////////////////////////////////////////////////////// @@ -207,6 +320,7 @@ trait Deserializer { /////////////////////////////////////////////////////////////////////////////// enum Token { + Null, Int(int), String(String), SeqStart(uint), @@ -214,6 +328,8 @@ enum Token { End, } +/////////////////////////////////////////////////////////////////////////////// + struct MyDeserializerState { tokens: Iter, peeked: Option, @@ -235,9 +351,79 @@ impl> MyDeserializerState { 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> VisitorState<()> for MyDeserializerState { +impl< + 'a, + Iter: Iterator, +> VisitorState< + (), +> for MyDeserializerState { + fn visit< + V: Visitor, + Value, + SeqValue, + >(&mut self, visitor: &mut V) -> Result { + match self.next() { + Some(Null) => { + visitor.visit_null() + } + Some(Int(v)) => { + visitor.visit_int(v) + } + Some(String(v)) => { + visitor.visit_string(v) + } + Some(SeqStart(len)) => { + let mut state = try!(visitor.visit_seq(len)); + + loop { + match self.peek() { + Some(&End) => { + self.next(); + break; + } + Some(_) => { + let value = try!(self.visit(visitor)); + try!(visitor.visit_seq_elt(&mut state, value)); + } + None => { + return Err(()); + } + } + } + + visitor.visit_seq_end(state) + } + Some(MapStart(len)) => { + Err(()) + } + Some(End) => { + Err(()) + } + None => { + Err(()) + } + } + + } + + fn visit_null(&mut self) -> Result<(), ()> { + match self.next() { + Some(Null) => Ok(()), + _ => Err(()) + } + } + fn visit_int(&mut self) -> Result { match self.next() { Some(Int(v)) => Ok(v), @@ -252,37 +438,31 @@ impl> VisitorState<()> for MyDeserializerState { } } - fn visit_seq< - T: Deserialize, ()>, - V: Visitor, ()> - >(&mut self) -> Result { - let len = match self.next() { - Some(SeqStart(len)) => len, - _ => { return Err(()); } - }; - - let mut visitor: V = Visitor::new(len); - - loop { - match self.next() { - Some(End) => { break; } - Some(token) => { - self.peeked = Some(token); - try!(visitor.visit(self)); - } - _ => { return Err(()); } - } + fn visit_seq(&mut self) -> Result { + match self.next() { + Some(SeqStart(len)) => Ok(len), + _ => Err(()), } - - visitor.unwrap() } fn visit_seq_elt< T: Deserialize, ()>, - >(&mut self) -> Result { - Deserialize::deserialize(self) + >(&mut self) -> Option> { + match self.peek() { + Some(&End) => { + self.next(); + None + } + Some(_) => { + Some(Deserialize::deserialize(self)) + } + None => { + Some(Err(())) + } + } } + /* fn visit_map< T: Deserialize, ()>, V: Visitor, ()> @@ -316,6 +496,7 @@ impl> VisitorState<()> for MyDeserializerState { let v = try!(Deserialize::deserialize(self)); Ok((k, v)) } + */ } /////////////////////////////////////////////////////////////////////////////// @@ -343,6 +524,7 @@ fn main() { let v: Result<(int, int), ()> = Deserialize::deserialize(&mut state); println!("{}", v); + /* let tokens = vec!( MapStart(2), String("a".to_string()), @@ -355,4 +537,5 @@ fn main() { let v: Result, ()> = Deserialize::deserialize(&mut state); println!("{}", v); + */ }