diff --git a/serde2/src/de2.rs b/serde2/src/de2.rs index b0a44b24..c0a7f667 100644 --- a/serde2/src/de2.rs +++ b/serde2/src/de2.rs @@ -3,13 +3,19 @@ use std::hash::Hash; /////////////////////////////////////////////////////////////////////////////// -trait Deserialize { - fn deserialize(state: &mut S) -> Result; +trait Deserialize { + fn deserialize(d: &mut D) -> Result; } /////////////////////////////////////////////////////////////////////////////// -trait VisitorState { +trait Deserializer { + fn deserialize>(&mut self) -> Result; +} + +/////////////////////////////////////////////////////////////////////////////// + +trait DeserializerState { fn syntax_error(&mut self) -> E; fn visit< @@ -20,38 +26,38 @@ trait VisitorState { trait Visitor< T, - S: VisitorState, + D: DeserializerState, E, > { - fn visit_null(&mut self, state: &mut S) -> Result { - Err(state.syntax_error()) + fn visit_null(&mut self, d: &mut D) -> Result { + Err(d.syntax_error()) } - fn visit_int(&mut self, state: &mut S, _v: int) -> Result { - Err(state.syntax_error()) + fn visit_int(&mut self, d: &mut D, _v: int) -> Result { + Err(d.syntax_error()) } - fn visit_string(&mut self, state: &mut S, _v: String) -> Result { - Err(state.syntax_error()) + fn visit_string(&mut self, d: &mut D, _v: String) -> Result { + Err(d.syntax_error()) } fn visit_seq< - V: SeqVisitor, - >(&mut self, state: &mut S, _visitor: V) -> Result { - Err(state.syntax_error()) + V: SeqVisitor, + >(&mut self, d: &mut D, _visitor: V) -> Result { + Err(d.syntax_error()) } fn visit_map< - V: MapVisitor, - >(&mut self, state: &mut S, _visitor: V) -> Result { - Err(state.syntax_error()) + V: MapVisitor, + >(&mut self, d: &mut D, _visitor: V) -> Result { + Err(d.syntax_error()) } } -trait SeqVisitor { +trait SeqVisitor { fn next< - T: Deserialize, - >(&mut self, state: &mut S) -> Option>; + T: Deserialize, + >(&mut self, d: &mut D) -> Option>; #[inline] fn size_hint(&self) -> (uint, Option) { @@ -59,11 +65,11 @@ trait SeqVisitor { } } -trait MapVisitor { +trait MapVisitor { fn next< - K: Deserialize, - V: Deserialize, - >(&mut self, state: &mut S) -> Option>; + K: Deserialize, + V: Deserialize, + >(&mut self, d: &mut D) -> Option>; #[inline] fn size_hint(&self) -> (uint, Option) { @@ -75,68 +81,68 @@ trait MapVisitor { /////////////////////////////////////////////////////////////////////////////// impl< - S: VisitorState, + D: DeserializerState, E, -> Deserialize for int { - fn deserialize(state: &mut S) -> Result { +> Deserialize for int { + fn deserialize(d: &mut D) -> Result { struct Visitor; impl< - S: VisitorState, + D: DeserializerState, E, - > ::Visitor for Visitor { - fn visit_int(&mut self, _state: &mut S, v: int) -> Result { + > ::Visitor for Visitor { + fn visit_int(&mut self, _d: &mut D, v: int) -> Result { Ok(v) } } - state.visit(&mut Visitor) + d.visit(&mut Visitor) } } impl< - S: VisitorState, + D: DeserializerState, E, -> Deserialize for String { - fn deserialize(state: &mut S) -> Result { +> Deserialize for String { + fn deserialize(d: &mut D) -> Result { struct Visitor; impl< - S: VisitorState, + D: DeserializerState, E, - > ::Visitor for Visitor { - fn visit_string(&mut self, _state: &mut S, v: String) -> Result { + > ::Visitor for Visitor { + fn visit_string(&mut self, _d: &mut D, v: String) -> Result { Ok(v) } } - state.visit(&mut Visitor) + d.visit(&mut Visitor) } } /////////////////////////////////////////////////////////////////////////////// impl< - T: Deserialize, - S: VisitorState, + T: Deserialize, + D: DeserializerState, E, -> Deserialize for Vec { - fn deserialize(state: &mut S) -> Result, E> { +> Deserialize for Vec { + fn deserialize(d: &mut D) -> Result, E> { struct Visitor; impl< - T: Deserialize, - S: VisitorState, + T: Deserialize, + D: DeserializerState, E, - > ::Visitor, S, E> for Visitor { + > ::Visitor, D, E> for Visitor { fn visit_seq< - Visitor: SeqVisitor, - >(&mut self, state: &mut S, mut visitor: Visitor) -> Result, E> { + Visitor: SeqVisitor, + >(&mut self, d: &mut D, mut visitor: Visitor) -> Result, E> { let (len, _) = visitor.size_hint(); let mut values = Vec::with_capacity(len); loop { - match visitor.next(state) { + match visitor.next(d) { Some(Ok(value)) => { values.push(value); } @@ -153,52 +159,52 @@ impl< } } - state.visit(&mut Visitor) + d.visit(&mut Visitor) } } /////////////////////////////////////////////////////////////////////////////// impl< - S: VisitorState, + D: DeserializerState, E -> Deserialize for () { - fn deserialize(state: &mut S) -> Result<(), E> { +> Deserialize for () { + fn deserialize(d: &mut D) -> Result<(), E> { struct Visitor; impl< - S: VisitorState, + D: DeserializerState, E, - > ::Visitor<(), S, E> for Visitor { - fn visit_null(&mut self, _state: &mut S) -> Result<(), E> { + > ::Visitor<(), D, E> for Visitor { + fn visit_null(&mut self, _d: &mut D) -> Result<(), E> { Ok(()) } } - state.visit(&mut Visitor) + d.visit(&mut Visitor) } } /////////////////////////////////////////////////////////////////////////////// impl< - T0: Deserialize, - T1: Deserialize, - S: VisitorState, + T0: Deserialize, + T1: Deserialize, + D: DeserializerState, E -> Deserialize for (T0, T1) { - fn deserialize(state: &mut S) -> Result<(T0, T1), E> { +> Deserialize for (T0, T1) { + fn deserialize(d: &mut D) -> Result<(T0, T1), E> { struct Visitor; impl< - T0: Deserialize, - T1: Deserialize, - S: VisitorState, + T0: Deserialize, + T1: Deserialize, + D: DeserializerState, E - > ::Visitor<(T0, T1), S, E> for Visitor { + > ::Visitor<(T0, T1), D, E> for Visitor { fn visit_seq< - Visitor: SeqVisitor, - >(&mut self, visitor_state: &mut S, mut visitor: Visitor) -> Result<(T0, T1), E> { + Visitor: SeqVisitor, + >(&mut self, d: &mut D, mut visitor: Visitor) -> Result<(T0, T1), E> { let mut state = 0u; let mut t0 = None; let mut t1 = None; @@ -206,24 +212,24 @@ impl< loop { match state { 0 => { - t0 = match visitor.next(visitor_state) { + t0 = match visitor.next(d) { Some(Ok(v)) => Some(v), Some(Err(err)) => { return Err(err); } - None => { return Err(visitor_state.syntax_error()); } + None => { return Err(d.syntax_error()); } }; state += 1; } 1 => { - t1 = match visitor.next(visitor_state) { + t1 = match visitor.next(d) { Some(Ok(v)) => Some(v), Some(Err(err)) => { return Err(err); } - None => { return Err(visitor_state.syntax_error()); } + None => { return Err(d.syntax_error()); } }; state += 1; } _ => { - match visitor.next(visitor_state) { - Some(Ok(())) => { return Err(visitor_state.syntax_error()); } + match visitor.next(d) { + Some(Ok(())) => { return Err(d.syntax_error()); } Some(Err(err)) => { return Err(err); } None => { break; } } @@ -233,40 +239,40 @@ impl< match (t0, t1) { (Some(t0), Some(t1)) => Ok((t0, t1)), - _ => Err(visitor_state.syntax_error()), + _ => Err(d.syntax_error()), } } } - state.visit(&mut Visitor) + d.visit(&mut Visitor) } } /////////////////////////////////////////////////////////////////////////////// impl< - K: Deserialize + Eq + Hash, - V: Deserialize, - S: VisitorState, + K: Deserialize + Eq + Hash, + V: Deserialize, + D: DeserializerState, E -> Deserialize for HashMap { - fn deserialize(state: &mut S) -> Result, E> { +> Deserialize for HashMap { + fn deserialize(d: &mut D) -> Result, E> { struct Visitor; impl< - K: Deserialize + Eq + Hash, - V: Deserialize, - S: VisitorState, + K: Deserialize + Eq + Hash, + V: Deserialize, + D: DeserializerState, E, - > ::Visitor, S, E> for Visitor { + > ::Visitor, D, E> for Visitor { fn visit_map< - Visitor: MapVisitor, - >(&mut self, state: &mut S, mut visitor: Visitor) -> Result, E> { + Visitor: MapVisitor, + >(&mut self, d: &mut D, mut visitor: Visitor) -> Result, E> { let (len, _) = visitor.size_hint(); let mut values = HashMap::with_capacity(len); loop { - match visitor.next(state) { + match visitor.next(d) { Some(Ok((key, value))) => { values.insert(key, value); } @@ -283,32 +289,32 @@ impl< } } - state.visit(&mut Visitor) + d.visit(&mut Visitor) } } impl< - K: Deserialize + Eq + Ord, - V: Deserialize, - S: VisitorState, + K: Deserialize + Eq + Ord, + V: Deserialize, + D: DeserializerState, E -> Deserialize for TreeMap { - fn deserialize(state: &mut S) -> Result, E> { +> Deserialize for TreeMap { + fn deserialize(d: &mut D) -> Result, E> { struct Visitor; impl< - K: Deserialize + Eq + Ord, - V: Deserialize, - S: VisitorState, + K: Deserialize + Eq + Ord, + V: Deserialize, + D: DeserializerState, E, - > ::Visitor, S, E> for Visitor { + > ::Visitor, D, E> for Visitor { fn visit_map< - Visitor: MapVisitor, - >(&mut self, state: &mut S, mut visitor: Visitor) -> Result, E> { + Visitor: MapVisitor, + >(&mut self, d: &mut D, mut visitor: Visitor) -> Result, E> { let mut values = TreeMap::new(); loop { - match visitor.next(state) { + match visitor.next(d) { Some(Ok((key, value))) => { values.insert(key, value); } @@ -325,7 +331,7 @@ impl< } } - state.visit(&mut Visitor) + d.visit(&mut Visitor) } } @@ -345,36 +351,36 @@ mod json { } impl< - S: super::VisitorState, + D: super::DeserializerState, E, - > super::Deserialize for Value { - fn deserialize(state: &mut S) -> Result { + > super::Deserialize for Value { + fn deserialize(d: &mut D) -> Result { struct Visitor; impl< - S: super::VisitorState, + D: super::DeserializerState, E, - > super::Visitor for Visitor { - fn visit_null(&mut self, _state: &mut S) -> Result { + > super::Visitor for Visitor { + fn visit_null(&mut self, _d: &mut D) -> Result { Ok(Null) } - fn visit_int(&mut self, _state: &mut S, v: int) -> Result { + fn visit_int(&mut self, _d: &mut D, v: int) -> Result { Ok(Int(v)) } - fn visit_string(&mut self, _state: &mut S, v: String) -> Result { + fn visit_string(&mut self, _d: &mut D, v: String) -> Result { Ok(String(v)) } fn visit_seq< - Visitor: ::SeqVisitor, - >(&mut self, state: &mut S, mut visitor: Visitor) -> Result { + 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(state) { + match visitor.next(d) { Some(Ok(value)) => { values.push(value); } @@ -391,12 +397,12 @@ mod json { } fn visit_map< - Visitor: ::MapVisitor, - >(&mut self, state: &mut S, mut visitor: Visitor) -> Result { + Visitor: ::MapVisitor, + >(&mut self, d: &mut D, mut visitor: Visitor) -> Result { let mut values = TreeMap::new(); loop { - match visitor.next(state) { + match visitor.next(d) { Some(Ok((key, value))) => { values.insert(key, value); } @@ -413,19 +419,13 @@ mod json { } } - state.visit(&mut Visitor) + d.visit(&mut Visitor) } } } /////////////////////////////////////////////////////////////////////////////// -trait Deserializer { - fn deserialize>(&mut self) -> Result; -} - -/////////////////////////////////////////////////////////////////////////////// - enum Token { Null, Int(int), @@ -437,14 +437,14 @@ enum Token { /////////////////////////////////////////////////////////////////////////////// -struct MyDeserializerState { +struct MyDeserializer { tokens: Iter, peeked: Option, } -impl> MyDeserializerState { - fn new(tokens: Iter) -> MyDeserializerState { - MyDeserializerState { +impl> MyDeserializer { + fn new(tokens: Iter) -> MyDeserializer { + MyDeserializer { tokens: tokens, peeked: None, } @@ -471,16 +471,16 @@ impl> MyDeserializerState { impl< Iter: Iterator, -> VisitorState< +> DeserializerState< (), -> for MyDeserializerState { +> for MyDeserializer { fn syntax_error(&mut self) -> () { () } fn visit< - V: Visitor, ()>, - T: Deserialize, ()>, + V: Visitor, ()>, + T: Deserialize, ()>, >(&mut self, visitor: &mut V) -> Result { match self.next() { Some(Null) => { @@ -514,21 +514,21 @@ struct MySeqVisitor { impl< Iter: Iterator, -> SeqVisitor, ()> for MySeqVisitor { +> SeqVisitor, ()> for MySeqVisitor { fn next< - T: Deserialize, ()>, - >(&mut self, state: &mut MyDeserializerState) -> Option> { - match state.peek() { + T: Deserialize, ()>, + >(&mut self, d: &mut MyDeserializer) -> Option> { + match d.peek() { Some(&End) => { - state.next(); + d.next(); None } Some(_) => { self.len -= 1; - Some(Deserialize::deserialize(state)) + Some(Deserialize::deserialize(d)) } None => { - Some(Err(state.syntax_error())) + Some(Err(d.syntax_error())) } } } @@ -544,25 +544,25 @@ struct MyMapVisitor { impl< Iter: Iterator, -> MapVisitor, ()> for MyMapVisitor { +> MapVisitor, ()> for MyMapVisitor { fn next< - K: Deserialize, ()>, - V: Deserialize, ()>, - >(&mut self, state: &mut MyDeserializerState) -> Option> { - match state.peek() { + K: Deserialize, ()>, + V: Deserialize, ()>, + >(&mut self, d: &mut MyDeserializer) -> Option> { + match d.peek() { Some(&End) => { - state.next(); + d.next(); None } Some(_) => { self.len -= 1; - let key = match Deserialize::deserialize(state) { + let key = match Deserialize::deserialize(d) { Ok(key) => key, Err(err) => { return Some(Err(err)); } }; - let value = match Deserialize::deserialize(state) { + let value = match Deserialize::deserialize(d) { Ok(value) => value, Err(err) => { return Some(Err(err)); } }; @@ -570,7 +570,7 @@ impl< Some(Ok((key, value))) } None => { - Some(Err(state.syntax_error())) + Some(Err(d.syntax_error())) } } } @@ -589,7 +589,7 @@ fn main() { Int(2), End ); - let mut state = MyDeserializerState::new(tokens.move_iter()); + let mut state = MyDeserializer::new(tokens.move_iter()); let v: Result, ()> = Deserialize::deserialize(&mut state); println!("{}", v); @@ -602,7 +602,7 @@ fn main() { Int(2), End ); - let mut state = MyDeserializerState::new(tokens.move_iter()); + let mut state = MyDeserializer::new(tokens.move_iter()); let v: Result<(int, int), ()> = Deserialize::deserialize(&mut state); println!("{}", v); @@ -615,7 +615,7 @@ fn main() { Int(2), End ); - let mut state = MyDeserializerState::new(tokens.move_iter()); + let mut state = MyDeserializer::new(tokens.move_iter()); let v: Result = Deserialize::deserialize(&mut state); println!("{}", v); @@ -630,7 +630,7 @@ fn main() { Int(2), End ); - let mut state = MyDeserializerState::new(tokens.move_iter()); + let mut state = MyDeserializer::new(tokens.move_iter()); let v: Result, ()> = Deserialize::deserialize(&mut state); println!("{}", v); @@ -645,7 +645,7 @@ fn main() { Int(2), End ); - let mut state = MyDeserializerState::new(tokens.move_iter()); + let mut state = MyDeserializer::new(tokens.move_iter()); let v: Result = Deserialize::deserialize(&mut state); println!("{}", v);