From 35786442f515ae32f130dc15472a481cf0376492 Mon Sep 17 00:00:00 2001 From: Erick Tryzelaar Date: Fri, 12 Sep 2014 07:55:28 -0700 Subject: [PATCH] add two deserialization variations --- serde2/src/de.rs | 94 ++++++++++++ serde2/src/de2.rs | 335 +++++++++++++++++++++++++++++++++++++++++ serde2/src/json/mod.rs | 1 + 3 files changed, 430 insertions(+) create mode 100644 serde2/src/de.rs create mode 100644 serde2/src/de2.rs diff --git a/serde2/src/de.rs b/serde2/src/de.rs new file mode 100644 index 00000000..0753fc33 --- /dev/null +++ b/serde2/src/de.rs @@ -0,0 +1,94 @@ +pub trait Deserialize { + fn deserialize(state: &mut D) -> Result; +} + +/////////////////////////////////////////////////////////////////////////////// + +pub trait Deserializer { + fn deserialize>(&mut self) -> R; +} + +/////////////////////////////////////////////////////////////////////////////// + +pub trait Visitor { + fn visit(&mut self, state: &mut S) -> Option; + + #[inline] + fn size_hint(&self) -> (uint, Option) { + (0, None) + } +} + +pub trait SeqVisitor { + +} + +pub trait VisitorState { + fn syntax_error + + + fn visit_int(&mut self) -> Result { + + } + + fn visit_seq(&mut self, ) -> Iter + +} + + + + + + + + + + + +/////////////////////////////////////////////////////////////////////////////// + +impl, E> Deserialize for int { + #[inline] + fn deserialize(state: &mut D) -> Result { + state.visit_int() + } +} + + +impl< + T: Deserialize, + D: VisitorState, + E +> Deserialize for Vec { + #[inline] + fn deserialize(state: &mut D) -> Result { + struct SeqVisitor { + + } + + impl SeqVisitor { + fn visit_seq>(len: uint, visitor: V) { + let mut value = Vec::with_capacity(len); + + loop { + match visitor.visit(self, &mut value) { + Some(()) => { } + None => { break; } + } + } + + value + } + + fn visit_seq_elt< + T: S + >(&mut self, value: &mut Vec) { + let v = Deserialize + value.push( + } + } + + let v = Vec::new(); + state.visit_seq() + } +} diff --git a/serde2/src/de2.rs b/serde2/src/de2.rs new file mode 100644 index 00000000..a6b4dead --- /dev/null +++ b/serde2/src/de2.rs @@ -0,0 +1,335 @@ +use std::collections::HashMap; +use std::hash::Hash; + +/////////////////////////////////////////////////////////////////////////////// + +trait Deserialize { + fn deserialize(state: &mut S) -> Result; +} + +/////////////////////////////////////////////////////////////////////////////// + +trait VisitorState { + fn visit_int(&mut self) -> Result; + + fn visit_string(&mut self) -> Result; + + fn visit_seq< + C: Deserialize, + V: Visitor + >(&mut self) -> Result; + + fn visit_map< + C: Deserialize, + V: Visitor + >(&mut self) -> Result; +} + +trait Visitor { + fn new(len: uint) -> Self; + + fn visit(&mut self, state: &mut S) -> Result<(), E>; + + fn unwrap(self) -> Result; +} + +/////////////////////////////////////////////////////////////////////////////// + +impl, E> Deserialize for int { + fn deserialize(state: &mut S) -> Result { + state.visit_int() + } +} + +impl, E> Deserialize for String { + fn deserialize(state: &mut S) -> Result { + state.visit_string() + } +} + +/////////////////////////////////////////////////////////////////////////////// + +impl< + T: Deserialize, + S: VisitorState, + E +> Deserialize for Vec { + fn deserialize(state: &mut S) -> Result, E> { + struct Visitor { + value: Vec, + } + + 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!(Deserialize::deserialize(state)); + self.value.push(value); + Ok(()) + } + + fn unwrap(self) -> Result, E> { + Ok(self.value) + } + } + + state.visit_seq::, Visitor>() + } +} + +/////////////////////////////////////////////////////////////////////////////// + +impl< + T0: Deserialize, + T1: Deserialize, + S: VisitorState, + E +> Deserialize for (T0, T1) { + fn deserialize(state: &mut S) -> Result<(T0, T1), E> { + struct Visitor { + state: uint, + t0: Option, + t1: Option, + } + + impl< + T0: Deserialize, + T1: Deserialize, + S, + E + > ::Visitor<(T0, T1), S, E> for Visitor { + fn new(_: uint) -> Visitor { + Visitor { + state: 0, + t0: None, + t1: None, + } + } + + fn visit(&mut self, state: &mut S) -> Result<(), E> { + match self.state { + 0 => { + self.state += 1; + self.t0 = Some(try!(Deserialize::deserialize(state))); + } + 1 => { + self.state += 1; + self.t1 = Some(try!(Deserialize::deserialize(state))); + } + _ => fail!() + } + + Ok(()) + } + + fn unwrap(self) -> Result<(T0, T1), E> { + let t0 = match self.t0 { + Some(t0) => t0, + None => { fail!(); } + }; + + let t1 = match self.t1 { + Some(t1) => t1, + None => { fail!(); } + }; + + Ok((t0, t1)) + } + } + + state.visit_seq::<(T0, T1), Visitor>() + } +} + +/////////////////////////////////////////////////////////////////////////////// + +impl< + K: Deserialize + Eq + Hash, + V: Deserialize, + S: VisitorState, + E +> Deserialize for HashMap { + fn deserialize(state: &mut S) -> Result, E> { + struct Visitor { + value: HashMap, + } + + impl< + K: Deserialize + Eq + Hash, + V: Deserialize, + S: VisitorState, + E + > ::Visitor, S, E> for Visitor { + fn new(len: uint) -> Visitor { + Visitor { + value: HashMap::with_capacity(len), + } + } + + fn visit(&mut self, state: &mut S) -> Result<(), E> { + let key = try!(Deserialize::deserialize(state)); + let value = try!(Deserialize::deserialize(state)); + self.value.insert(key, value); + Ok(()) + } + + fn unwrap(self) -> Result, E> { + Ok(self.value) + } + } + + state.visit_map::, Visitor>() + } +} + +/////////////////////////////////////////////////////////////////////////////// + +trait Deserializer { + fn deserialize>(&mut self) -> Result; +} + +/////////////////////////////////////////////////////////////////////////////// + +enum Token { + Int(int), + String(String), + SeqStart(uint), + MapStart(uint), + End, +} + +struct MyDeserializerState { + tokens: Iter, + peeked: Option, +} + +impl> MyDeserializerState { + fn new(tokens: Iter) -> MyDeserializerState { + MyDeserializerState { + tokens: tokens, + peeked: None, + } + } + + fn next(&mut self) -> Option { + match self.peeked.take() { + Some(token) => { return Some(token); } + None => { } + } + + self.tokens.next() + } +} + +impl> VisitorState<()> for MyDeserializerState { + fn visit_int(&mut self) -> Result { + match self.next() { + Some(Int(v)) => Ok(v), + _ => Err(()) + } + } + + fn visit_string(&mut self) -> Result { + match self.next() { + Some(String(v)) => Ok(v), + _ => Err(()) + } + } + + 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(()); } + } + } + + visitor.unwrap() + } + + fn visit_map< + T: Deserialize, ()>, + V: Visitor, ()> + >(&mut self) -> Result { + let len = match self.next() { + Some(MapStart(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(()); } + } + } + + visitor.unwrap() + } +} + +/////////////////////////////////////////////////////////////////////////////// + +fn main() { + let tokens = vec!( + SeqStart(2), + Int(1), + Int(2), + End + ); + let mut state = MyDeserializerState::new(tokens.move_iter()); + + let v: Result, ()> = Deserialize::deserialize(&mut state); + println!("{}", v); + + let tokens = vec!( + SeqStart(2), + Int(1), + Int(2), + End + ); + let mut state = MyDeserializerState::new(tokens.move_iter()); + + let v: Result<(int, int), ()> = Deserialize::deserialize(&mut state); + println!("{}", v); + + let tokens = vec!( + MapStart(2), + String("a".to_string()), + Int(1), + String("b".to_string()), + Int(2), + End + ); + let mut state = MyDeserializerState::new(tokens.move_iter()); + + let v: Result, ()> = Deserialize::deserialize(&mut state); + println!("{}", v); +} diff --git a/serde2/src/json/mod.rs b/serde2/src/json/mod.rs index 88ab1c5e..d67c8c5b 100644 --- a/serde2/src/json/mod.rs +++ b/serde2/src/json/mod.rs @@ -3,3 +3,4 @@ pub use self::ser::{to_vec, to_string}; pub use self::ser::escape_str; pub mod ser; +pub mod de;