Add visit_*_elt to de2

This commit is contained in:
Erick Tryzelaar
2014-09-12 18:48:01 -07:00
parent 401e621814
commit c3a5becd22
+35 -12
View File
@@ -15,14 +15,23 @@ trait VisitorState<E> {
fn visit_string(&mut self) -> Result<String, E>; fn visit_string(&mut self) -> Result<String, E>;
fn visit_seq< fn visit_seq<
C: Deserialize<Self, E>, T: Deserialize<Self, E>,
V: Visitor<C, Self, E> V: Visitor<T, Self, E>
>(&mut self) -> Result<C, E>; >(&mut self) -> Result<T, E>;
fn visit_seq_elt<
T: Deserialize<Self, E>,
>(&mut self) -> Result<T, E>;
fn visit_map< fn visit_map<
C: Deserialize<Self, E>, T: Deserialize<Self, E>,
V: Visitor<C, Self, E> V: Visitor<T, Self, E>
>(&mut self) -> Result<C, E>; >(&mut self) -> Result<T, E>;
fn visit_map_elt<
K: Deserialize<Self, E>,
V: Deserialize<Self, E>
>(&mut self) -> Result<(K, V), E>;
} }
trait Visitor<C, S, E> { trait Visitor<C, S, E> {
@@ -71,7 +80,7 @@ impl<
} }
fn visit(&mut self, state: &mut S) -> Result<(), E> { 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); self.value.push(value);
Ok(()) Ok(())
} }
@@ -103,7 +112,7 @@ impl<
impl< impl<
T0: Deserialize<S, E>, T0: Deserialize<S, E>,
T1: Deserialize<S, E>, T1: Deserialize<S, E>,
S, S: VisitorState<E>,
E E
> ::Visitor<(T0, T1), S, E> for Visitor<T0, T1> { > ::Visitor<(T0, T1), S, E> for Visitor<T0, T1> {
fn new(_: uint) -> Visitor<T0, T1> { fn new(_: uint) -> Visitor<T0, T1> {
@@ -118,11 +127,11 @@ impl<
match self.state { match self.state {
0 => { 0 => {
self.state += 1; self.state += 1;
self.t0 = Some(try!(Deserialize::deserialize(state))); self.t0 = Some(try!(state.visit_seq_elt()));
} }
1 => { 1 => {
self.state += 1; self.state += 1;
self.t1 = Some(try!(Deserialize::deserialize(state))); self.t1 = Some(try!(state.visit_seq_elt()));
} }
_ => fail!() _ => fail!()
} }
@@ -175,8 +184,7 @@ impl<
} }
fn visit(&mut self, state: &mut S) -> Result<(), E> { fn visit(&mut self, state: &mut S) -> Result<(), E> {
let key = try!(Deserialize::deserialize(state)); let (key, value) = try!(state.visit_map_elt());
let value = try!(Deserialize::deserialize(state));
self.value.insert(key, value); self.value.insert(key, value);
Ok(()) Ok(())
} }
@@ -269,6 +277,12 @@ impl<Iter: Iterator<Token>> VisitorState<()> for MyDeserializerState<Iter> {
visitor.unwrap() visitor.unwrap()
} }
fn visit_seq_elt<
T: Deserialize<MyDeserializerState<Iter>, ()>,
>(&mut self) -> Result<T, ()> {
Deserialize::deserialize(self)
}
fn visit_map< fn visit_map<
T: Deserialize<MyDeserializerState<Iter>, ()>, T: Deserialize<MyDeserializerState<Iter>, ()>,
V: Visitor<T, MyDeserializerState<Iter>, ()> V: Visitor<T, MyDeserializerState<Iter>, ()>
@@ -293,6 +307,15 @@ impl<Iter: Iterator<Token>> VisitorState<()> for MyDeserializerState<Iter> {
visitor.unwrap() visitor.unwrap()
} }
fn visit_map_elt<
K: Deserialize<MyDeserializerState<Iter>, ()>,
V: Deserialize<MyDeserializerState<Iter>, ()>
>(&mut self) -> Result<(K, V), ()> {
let k = try!(Deserialize::deserialize(self));
let v = try!(Deserialize::deserialize(self));
Ok((k, v))
}
} }
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////