Add visit_*_elt to de2

This commit is contained in:
Erick Tryzelaar 2014-09-12 18:48:01 -07:00
parent 401e621814
commit c3a5becd22

@ -15,14 +15,23 @@ trait VisitorState<E> {
fn visit_string(&mut self) -> Result<String, E>;
fn visit_seq<
C: Deserialize<Self, E>,
V: Visitor<C, Self, E>
>(&mut self) -> Result<C, E>;
T: Deserialize<Self, E>,
V: Visitor<T, Self, E>
>(&mut self) -> Result<T, E>;
fn visit_seq_elt<
T: Deserialize<Self, E>,
>(&mut self) -> Result<T, E>;
fn visit_map<
C: Deserialize<Self, E>,
V: Visitor<C, Self, E>
>(&mut self) -> Result<C, E>;
T: Deserialize<Self, E>,
V: Visitor<T, Self, 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> {
@ -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<S, E>,
T1: Deserialize<S, E>,
S,
S: VisitorState<E>,
E
> ::Visitor<(T0, T1), S, E> for Visitor<T0, T1> {
fn new(_: uint) -> Visitor<T0, T1> {
@ -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<Iter: Iterator<Token>> VisitorState<()> for MyDeserializerState<Iter> {
visitor.unwrap()
}
fn visit_seq_elt<
T: Deserialize<MyDeserializerState<Iter>, ()>,
>(&mut self) -> Result<T, ()> {
Deserialize::deserialize(self)
}
fn visit_map<
T: Deserialize<MyDeserializerState<Iter>, ()>,
V: Visitor<T, MyDeserializerState<Iter>, ()>
@ -293,6 +307,15 @@ impl<Iter: Iterator<Token>> VisitorState<()> for MyDeserializerState<Iter> {
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))
}
}
///////////////////////////////////////////////////////////////////////////////