From e605d70af1333ab75561de72a00d088687a1fded Mon Sep 17 00:00:00 2001 From: Erick Tryzelaar Date: Fri, 3 Oct 2014 07:50:30 -0700 Subject: [PATCH] Add support for deserialization streams that have an option type --- serde2/src/bin.rs | 106 ++++++++++++++++++++++++++++++++++++++++------ serde2/src/de2.rs | 43 +------------------ 2 files changed, 95 insertions(+), 54 deletions(-) diff --git a/serde2/src/bin.rs b/serde2/src/bin.rs index 55662d4e..e56826b6 100644 --- a/serde2/src/bin.rs +++ b/serde2/src/bin.rs @@ -8,6 +8,7 @@ enum Token { Null, Int(int), //String(String), + Optiony(bool), SeqStart(uint), //MapStart(uint), End, @@ -23,7 +24,7 @@ enum Error { struct MyDeserializer { tokens: Iter, - peeked: Option, + peeked: ::std::option::Option, } impl> MyDeserializer { @@ -70,6 +71,12 @@ impl> Deserializer for MyDeserializer { visitor.visit_string(self, v) } */ + Some(Optiony(is_some)) => { + visitor.visit_option(self, MyOptionVisitor { + is_some: is_some, + finished: false, + }) + } Some(SeqStart(len)) => { visitor.visit_seq(self, MySeqVisitor { len: len }) } @@ -95,6 +102,15 @@ impl> Deserializer for MyDeserializer { self.next(); Ok(None) } + Some(&Optiony(true)) => { + self.next(); + let v = try!(Deserialize::deserialize(self)); + Ok(Some(v)) + } + Some(&Optiony(false)) => { + self.next(); + Ok(None) + } _ => { let v = try!(Deserialize::deserialize(self)); Ok(Some(v)) @@ -111,6 +127,32 @@ impl> Deserializer for MyDeserializer { } } +struct MyOptionVisitor { + is_some: bool, + finished: bool, +} + +impl< + Iter: Iterator, +> de2::OptionVisitor, Error> for MyOptionVisitor { + fn visit< + T: Deserialize, Error>, + >(&mut self, d: &mut MyDeserializer) -> Result, Error> { + if self.finished { + Err(d.syntax_error()) + } else { + self.finished = true; + + if self.is_some { + let v = try!(Deserialize::deserialize(d)); + Ok(Some(v)) + } else { + Ok(None) + } + } + } +} + struct MySeqVisitor { len: uint, } @@ -220,16 +262,14 @@ mod json { } */ - /* fn visit_option< Visitor: de2::OptionVisitor, >(&mut self, d: &mut D, mut visitor: Visitor) -> Result { - match visitor.next(d) { - Some(v) => v, + match try!(visitor.visit(d)) { + Some(value) => Ok(value), None => Ok(Null), } } - */ fn visit_seq< Visitor: de2::SeqVisitor, @@ -294,7 +334,7 @@ fn main() { let mut state = MyDeserializer::new(tokens.into_iter()); let v: Result, Error> = Deserialize::deserialize(&mut state); - println!("{}", v); + println!("vec: {}", v); //// @@ -307,7 +347,7 @@ fn main() { let mut state = MyDeserializer::new(tokens.into_iter()); let v: Result<(int, int), Error> = Deserialize::deserialize(&mut state); - println!("{}", v); + println!("tuple: {}", v); //// @@ -320,7 +360,49 @@ fn main() { let mut state = MyDeserializer::new(tokens.into_iter()); let v: Result = Deserialize::deserialize(&mut state); - println!("{}", v); + println!("value: {}", v); + + //// + + let tokens = vec!( + Optiony(true), + Int(1), + ); + let mut state = MyDeserializer::new(tokens.into_iter()); + + let v: Result, Error> = Deserialize::deserialize(&mut state); + println!("optiony: {}", v); + + //// + + let tokens = vec!( + Optiony(false), + ); + let mut state = MyDeserializer::new(tokens.into_iter()); + + let v: Result, Error> = Deserialize::deserialize(&mut state); + println!("optiony: {}", v); + + //// + + let tokens = vec!( + Optiony(true), + Int(1), + ); + let mut state = MyDeserializer::new(tokens.into_iter()); + + let v: Result = Deserialize::deserialize(&mut state); + println!("optiony value:{}", v); + + //// + + let tokens = vec!( + Optiony(false), + ); + let mut state = MyDeserializer::new(tokens.into_iter()); + + let v: Result = Deserialize::deserialize(&mut state); + println!("optiony value:{}", v); //// @@ -330,7 +412,7 @@ fn main() { let mut state = MyDeserializer::new(tokens.into_iter()); let v: Result, Error> = Deserialize::deserialize(&mut state); - println!("{}", v); + println!("option: {}", v); //// @@ -340,7 +422,7 @@ fn main() { let mut state = MyDeserializer::new(tokens.into_iter()); let v: Result, Error> = Deserialize::deserialize(&mut state); - println!("{}", v); + println!("option: {}", v); //// @@ -350,7 +432,7 @@ fn main() { let mut state = MyDeserializer::new(tokens.into_iter()); let v: Result = Deserialize::deserialize(&mut state); - println!("{}", v); + println!("option value: {}", v); //// @@ -360,7 +442,7 @@ fn main() { let mut state = MyDeserializer::new(tokens.into_iter()); let v: Result = Deserialize::deserialize(&mut state); - println!("{}", v); + println!("option value: {}", v); /* //// diff --git a/serde2/src/de2.rs b/serde2/src/de2.rs index b8c155e5..091c477d 100644 --- a/serde2/src/de2.rs +++ b/serde2/src/de2.rs @@ -31,13 +31,11 @@ pub trait Visitor, R, E> { Err(d.syntax_error()) } - /* fn visit_option< V: OptionVisitor >(&mut self, d: &mut D, _visitor: V) -> Result { Err(d.syntax_error()) } - */ fn visit_seq< V: SeqVisitor @@ -46,19 +44,11 @@ pub trait Visitor, R, E> { } } -/* -pub trait OptionVisitor, E> { - /* - fn next< - T: Deserialize, - >(&mut self, d: &mut D) -> Option>; - */ - +pub trait OptionVisitor { fn visit< T: Deserialize, >(&mut self, d: &mut D) -> Result, E>; } -*/ pub trait SeqVisitor { fn next< @@ -119,37 +109,6 @@ impl< E, > Deserialize for Option { fn deserialize(d: &mut D) -> Result, E> { - /* - struct Visitor; - - impl< - R: Deserialize, - D: Deserializer, - E, - > self::OptionVisitor for Visitor { - /* - fn visit_option< - V: OptionVisitor, - >(&mut self, d: &mut D, mut visitor: V) -> Result, E> { - match visitor.next(d) { - Some(value) => { - Ok(Some(try!(value))) - } - None => { - Ok(None) - } - } - } - */ - - fn visit< - T: Deserialize, - >(&mut self, d: &mut D, value: Option) -> Result, E> { - Ok(value) - } - } - */ - d.visit_option() } }