diff --git a/serde2/src/de2.rs b/serde2/src/de2.rs index a6b4dead..f37ade2c 100644 --- a/serde2/src/de2.rs +++ b/serde2/src/de2.rs @@ -15,14 +15,23 @@ trait VisitorState { fn visit_string(&mut self) -> Result; fn visit_seq< - C: Deserialize, - V: Visitor - >(&mut self) -> Result; + T: Deserialize, + V: Visitor + >(&mut self) -> Result; + + fn visit_seq_elt< + T: Deserialize, + >(&mut self) -> Result; fn visit_map< - C: Deserialize, - V: Visitor - >(&mut self) -> Result; + T: Deserialize, + V: Visitor + >(&mut self) -> Result; + + fn visit_map_elt< + K: Deserialize, + V: Deserialize + >(&mut self) -> Result<(K, V), E>; } trait Visitor { @@ -71,7 +80,7 @@ impl< } fn visit(&mut self, state: &mut S) -> Result<(), E> { - let value = try!(Deserialize::deserialize(state)); + let value = try!(state.visit_seq_elt()); self.value.push(value); Ok(()) } @@ -103,7 +112,7 @@ impl< impl< T0: Deserialize, T1: Deserialize, - S, + S: VisitorState, E > ::Visitor<(T0, T1), S, E> for Visitor { fn new(_: uint) -> Visitor { @@ -118,11 +127,11 @@ impl< match self.state { 0 => { self.state += 1; - self.t0 = Some(try!(Deserialize::deserialize(state))); + self.t0 = Some(try!(state.visit_seq_elt())); } 1 => { self.state += 1; - self.t1 = Some(try!(Deserialize::deserialize(state))); + self.t1 = Some(try!(state.visit_seq_elt())); } _ => fail!() } @@ -175,8 +184,7 @@ impl< } fn visit(&mut self, state: &mut S) -> Result<(), E> { - let key = try!(Deserialize::deserialize(state)); - let value = try!(Deserialize::deserialize(state)); + let (key, value) = try!(state.visit_map_elt()); self.value.insert(key, value); Ok(()) } @@ -269,6 +277,12 @@ impl> VisitorState<()> for MyDeserializerState { visitor.unwrap() } + fn visit_seq_elt< + T: Deserialize, ()>, + >(&mut self) -> Result { + Deserialize::deserialize(self) + } + fn visit_map< T: Deserialize, ()>, V: Visitor, ()> @@ -293,6 +307,15 @@ impl> VisitorState<()> for MyDeserializerState { visitor.unwrap() } + + fn visit_map_elt< + K: Deserialize, ()>, + V: Deserialize, ()> + >(&mut self) -> Result<(K, V), ()> { + let k = try!(Deserialize::deserialize(self)); + let v = try!(Deserialize::deserialize(self)); + Ok((k, v)) + } } ///////////////////////////////////////////////////////////////////////////////