diff --git a/serde2/src/bin.rs b/serde2/src/bin.rs index f154e705..8a49216e 100644 --- a/serde2/src/bin.rs +++ b/serde2/src/bin.rs @@ -4,8 +4,8 @@ use std::collections::HashMap; use std::option; use std::string; -use serde2::de2; -use serde2::de2::{Deserialize, Deserializer}; +use serde2::de; +use serde2::de::{Deserialize, Deserializer}; #[deriving(Show)] enum Token { @@ -61,7 +61,7 @@ impl> MyDeserializer { impl> Deserializer for MyDeserializer { fn visit< R, - V: de2::Visitor, R, Error>, + V: de::Visitor, R, Error>, >(&mut self, visitor: &mut V) -> Result { match self.next() { Some(Null) => { @@ -95,7 +95,7 @@ impl> Deserializer for MyDeserializer { fn visit_option< R, - V: de2::Visitor, R, Error>, + V: de::Visitor, R, Error>, >(&mut self, visitor: &mut V) -> Result { match self.peek() { Some(&Null) => { @@ -133,7 +133,7 @@ struct MyOptionVisitor { impl< Iter: Iterator, -> de2::OptionVisitor, Error> for MyOptionVisitor { +> de::OptionVisitor, Error> for MyOptionVisitor { fn visit< T: Deserialize, Error>, >(&mut self, d: &mut MyDeserializer) -> Result, Error> { @@ -153,7 +153,7 @@ struct MySeqVisitor { impl< Iter: Iterator, -> de2::SeqVisitor, Error> for MySeqVisitor { +> de::SeqVisitor, Error> for MySeqVisitor { fn visit< T: Deserialize, Error> >(&mut self, d: &mut MyDeserializer) -> Result, Error> { @@ -192,7 +192,7 @@ struct MyMapVisitor { impl< Iter: Iterator, -> de2::MapVisitor, Error> for MyMapVisitor { +> de::MapVisitor, Error> for MyMapVisitor { fn visit< K: Deserialize, Error>, V: Deserialize, Error>, @@ -233,7 +233,7 @@ impl< mod json { use std::collections::TreeMap; - use serde2::de2; + use serde2::de; #[deriving(Show)] pub enum Value { @@ -246,16 +246,16 @@ mod json { } impl< - D: de2::Deserializer, + D: de::Deserializer, E, - > de2::Deserialize for Value { + > de::Deserialize for Value { fn deserialize(d: &mut D) -> Result { struct Visitor; impl< - D: de2::Deserializer, + D: de::Deserializer, E, - > de2::Visitor for Visitor { + > de::Visitor for Visitor { fn visit_null(&mut self, _d: &mut D) -> Result { Ok(Null) } @@ -271,7 +271,7 @@ mod json { */ fn visit_option< - Visitor: de2::OptionVisitor, + Visitor: de::OptionVisitor, >(&mut self, d: &mut D, mut visitor: Visitor) -> Result { match try!(visitor.visit(d)) { Some(value) => Ok(value), @@ -280,7 +280,7 @@ mod json { } fn visit_seq< - Visitor: de2::SeqVisitor, + Visitor: de::SeqVisitor, >(&mut self, d: &mut D, mut visitor: Visitor) -> Result { let (len, _) = visitor.size_hint(d); let mut values = Vec::with_capacity(len); @@ -300,7 +300,7 @@ mod json { } fn visit_map< - Visitor: de2::MapVisitor, + Visitor: de::MapVisitor, >(&mut self, d: &mut D, mut visitor: Visitor) -> Result { let mut values = TreeMap::new(); @@ -480,8 +480,8 @@ fn main() { /* use std::collections::TreeMap; -use serde2::{Serialize, GatherTokens}; -use serde2::json; +use serde::{Serialize, GatherTokens}; +use serde::json; /////////////////////////////////////////////////////////////////////////////// @@ -491,7 +491,7 @@ struct Foo { z: &'static str, } -impl, R> serde2::Serialize for Foo { +impl, R> serde::Serialize for Foo { fn serialize(&self, state: &mut S) -> R { state.visit_named_map("Foo", FooSerialize { value: self, @@ -505,7 +505,7 @@ struct FooSerialize<'a> { state: uint, } -impl<'a, S: serde2::VisitorState, R> serde2::Visitor for FooSerialize<'a> { +impl<'a, S: serde::VisitorState, R> serde::Visitor for FooSerialize<'a> { fn visit(&mut self, state: &mut S) -> Option { match self.state { 0 => { diff --git a/serde2/src/de.rs b/serde2/src/de.rs index 3b2f4672..cd667743 100644 --- a/serde2/src/de.rs +++ b/serde2/src/de.rs @@ -1,93 +1,359 @@ -pub trait Deserialize { - fn deserialize(state: &mut S) -> Result; -} +use std::collections::{HashMap, TreeMap}; +use std::hash::Hash; /////////////////////////////////////////////////////////////////////////////// -pub trait Deserializer { - fn deserialize>(&mut self) -> R; - +pub trait Deserialize { + fn deserialize(d: &mut D) -> Result; } -/////////////////////////////////////////////////////////////////////////////// +pub trait Deserializer { + fn visit< + R, + V: Visitor, + >(&mut self, visitor: &mut V) -> Result; -pub trait Visitor { - fn visit(&mut self, state: &mut S) -> Option; + fn visit_option< + R, + V: Visitor, + >(&mut self, visitor: &mut V) -> Result { + self.visit(visitor) + } + + fn syntax_error(&mut self) -> E; + + fn end_of_stream_error(&mut self) -> E; +} + +pub trait Visitor, R, E> { + fn visit_null(&mut self, d: &mut D) -> Result { + Err(d.syntax_error()) + } + + fn visit_int(&mut self, d: &mut D, _v: int) -> Result { + Err(d.syntax_error()) + } + + fn visit_str(&mut self, d: &mut D, v: &str) -> Result { + self.visit_string(d, v.to_string()) + } + + fn visit_string(&mut self, d: &mut D, _v: String) -> Result { + 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, + >(&mut self, d: &mut D, _visitor: V) -> Result { + Err(d.syntax_error()) + } + + fn visit_map< + V: MapVisitor, + >(&mut self, d: &mut D, _visitor: V) -> Result { + Err(d.syntax_error()) + } +} + +pub trait OptionVisitor { + fn visit< + T: Deserialize, + >(&mut self, d: &mut D) -> Result, E>; +} + +pub trait SeqVisitor { + fn visit< + T: Deserialize, + >(&mut self, d: &mut D) -> Result, E>; + + fn end(&mut self, d: &mut D) -> Result<(), E>; #[inline] - fn size_hint(&self) -> (uint, Option) { + fn size_hint(&self, _d: &mut D) -> (uint, Option) { (0, None) } } -pub trait SeqVisitor { +pub trait MapVisitor { + fn visit< + K: Deserialize, + V: Deserialize, + >(&mut self, d: &mut D) -> Result, E>; -} + fn end(&mut self, d: &mut D) -> Result<(), E>; -pub trait VisitorState { - fn syntax_error(&mut self) -> E; - - fn visit_int(&mut self) -> Result { + #[inline] + fn size_hint(&self, _d: &mut D) -> (uint, Option) { + (0, None) } - - fn visit_seq(&mut self, ) -> Iter - } - - - - - - - - - - /////////////////////////////////////////////////////////////////////////////// -impl, E> Deserialize for int { - #[inline] - fn deserialize(state: &mut D) -> Result { - state.visit_int() +impl< + D: Deserializer, + E, +> Deserialize for () { + fn deserialize(d: &mut D) -> Result<(), E> { + struct Visitor; + + impl, E> self::Visitor for Visitor { + fn visit_null(&mut self, _d: &mut D) -> Result<(), E> { + Ok(()) + } + } + + d.visit(&mut Visitor) } } +/////////////////////////////////////////////////////////////////////////////// + +impl< + D: Deserializer, + E, +> Deserialize for int { + fn deserialize(d: &mut D) -> Result { + struct Visitor; + + impl, E> self::Visitor for Visitor { + fn visit_int(&mut self, _d: &mut D, v: int) -> Result { + Ok(v) + } + } + + d.visit(&mut Visitor) + } +} + +/////////////////////////////////////////////////////////////////////////////// + +impl< + D: Deserializer, + E, +> Deserialize for String { + fn deserialize(d: &mut D) -> Result { + struct Visitor; + + impl, E> self::Visitor for Visitor { + fn visit_string(&mut self, _d: &mut D, v: String) -> Result { + Ok(v) + } + } + + d.visit(&mut Visitor) + } +} + +/////////////////////////////////////////////////////////////////////////////// impl< T: Deserialize, - D: VisitorState, - E -> Deserialize for Vec { - #[inline] - fn deserialize(state: &mut D) -> Result { - struct SeqVisitor { + D: Deserializer, + E, +> Deserialize for Option { + fn deserialize(d: &mut D) -> Result, E> { + struct Visitor; + impl< + T: Deserialize, + D: Deserializer, + E, + > self::Visitor, E> for Visitor { + fn visit_option< + V: OptionVisitor, + >(&mut self, d: &mut D, mut visitor: V) -> Result, E> { + visitor.visit(d) + } } - impl SeqVisitor { - fn visit_seq>(len: uint, visitor: V) { - let mut value = Vec::with_capacity(len); + d.visit_option(&mut Visitor) + } +} + +/////////////////////////////////////////////////////////////////////////////// + +impl< + T: Deserialize, + D: Deserializer, + E, +> Deserialize for Vec { + fn deserialize(d: &mut D) -> Result, E> { + struct Visitor; + + impl< + T: Deserialize, + D: Deserializer, + E, + > self::Visitor, E> for Visitor { + fn visit_seq< + V: SeqVisitor, + >(&mut self, d: &mut D, mut visitor: V) -> Result, E> { + let (len, _) = visitor.size_hint(d); + let mut values = Vec::with_capacity(len); loop { - match visitor.visit(self, &mut value) { - Some(()) => { } - None => { break; } + match try!(visitor.visit(d)) { + Some(value) => { + values.push(value); + } + None => { + break; + } } } - value - } - - fn visit_seq_elt< - T: S - >(&mut self, value: &mut Vec) { - let v = Deserialize - value.push( + Ok(values) } } - let v = Vec::new(); - state.visit_seq() + d.visit(&mut Visitor) + } +} + +impl< + T0: Deserialize, + T1: Deserialize, + D: Deserializer, + E, +> Deserialize for (T0, T1) { + fn deserialize(d: &mut D) -> Result<(T0, T1), E> { + struct Visitor; + + impl< + T0: Deserialize, + T1: Deserialize, + D: Deserializer, + E, + > self::Visitor for Visitor { + fn visit_seq< + V: SeqVisitor, + >(&mut self, d: &mut D, mut visitor: V) -> Result<(T0, T1), E> { + let mut state = 0u; + let mut t0 = None; + let mut t1 = None; + + loop { + match state { + 0 => { + state += 1; + match try!(visitor.visit(d)) { + Some(value) => { + t0 = Some(value); + } + None => { + return Err(d.end_of_stream_error()); + } + } + } + 1 => { + state += 1; + match try!(visitor.visit(d)) { + Some(value) => { + t1 = Some(value); + } + None => { + return Err(d.end_of_stream_error()); + } + } + } + _ => { + try!(visitor.end(d)); + + return Ok((t0.unwrap(), t1.unwrap())); + } + } + } + } + } + + d.visit(&mut Visitor) + } +} + +/////////////////////////////////////////////////////////////////////////////// + +impl< + K: Deserialize + Eq + Hash, + V: Deserialize, + D: Deserializer, + E, +> Deserialize for HashMap { + fn deserialize(d: &mut D) -> Result, E> { + struct Visitor; + + impl< + K: Deserialize + Eq + Hash, + V: Deserialize, + D: Deserializer, + E, + > self::Visitor, E> for Visitor { + fn visit_map< + Visitor: MapVisitor, + >(&mut self, d: &mut D, mut visitor: Visitor) -> Result, E> { + let (len, _) = visitor.size_hint(d); + let mut values = HashMap::with_capacity(len); + + loop { + match try!(visitor.visit(d)) { + Some((key, value)) => { + values.insert(key, value); + } + None => { + break; + } + } + } + + Ok(values) + } + } + + d.visit(&mut Visitor) + } +} + +impl< + K: Deserialize + Eq + Ord, + V: Deserialize, + D: Deserializer, + E, +> Deserialize for TreeMap { + fn deserialize(d: &mut D) -> Result, E> { + struct Visitor; + + impl< + K: Deserialize + Eq + Ord, + V: Deserialize, + D: Deserializer, + E, + > self::Visitor, E> for Visitor { + fn visit_map< + Visitor: MapVisitor, + >(&mut self, d: &mut D, mut visitor: Visitor) -> Result, E> { + let mut values = TreeMap::new(); + + loop { + match try!(visitor.visit(d)) { + Some((key, value)) => { + values.insert(key, value); + } + None => { + break; + } + } + } + + Ok(values) + } + } + + d.visit(&mut Visitor) } } diff --git a/serde2/src/de2.rs b/serde2/src/de2.rs deleted file mode 100644 index cd667743..00000000 --- a/serde2/src/de2.rs +++ /dev/null @@ -1,359 +0,0 @@ -use std::collections::{HashMap, TreeMap}; -use std::hash::Hash; - -/////////////////////////////////////////////////////////////////////////////// - -pub trait Deserialize { - fn deserialize(d: &mut D) -> Result; -} - -pub trait Deserializer { - fn visit< - R, - V: Visitor, - >(&mut self, visitor: &mut V) -> Result; - - fn visit_option< - R, - V: Visitor, - >(&mut self, visitor: &mut V) -> Result { - self.visit(visitor) - } - - fn syntax_error(&mut self) -> E; - - fn end_of_stream_error(&mut self) -> E; -} - -pub trait Visitor, R, E> { - fn visit_null(&mut self, d: &mut D) -> Result { - Err(d.syntax_error()) - } - - fn visit_int(&mut self, d: &mut D, _v: int) -> Result { - Err(d.syntax_error()) - } - - fn visit_str(&mut self, d: &mut D, v: &str) -> Result { - self.visit_string(d, v.to_string()) - } - - fn visit_string(&mut self, d: &mut D, _v: String) -> Result { - 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, - >(&mut self, d: &mut D, _visitor: V) -> Result { - Err(d.syntax_error()) - } - - fn visit_map< - V: MapVisitor, - >(&mut self, d: &mut D, _visitor: V) -> Result { - Err(d.syntax_error()) - } -} - -pub trait OptionVisitor { - fn visit< - T: Deserialize, - >(&mut self, d: &mut D) -> Result, E>; -} - -pub trait SeqVisitor { - fn visit< - T: Deserialize, - >(&mut self, d: &mut D) -> Result, E>; - - fn end(&mut self, d: &mut D) -> Result<(), E>; - - #[inline] - fn size_hint(&self, _d: &mut D) -> (uint, Option) { - (0, None) - } -} - -pub trait MapVisitor { - fn visit< - K: Deserialize, - V: Deserialize, - >(&mut self, d: &mut D) -> Result, E>; - - fn end(&mut self, d: &mut D) -> Result<(), E>; - - #[inline] - fn size_hint(&self, _d: &mut D) -> (uint, Option) { - (0, None) - } -} - -/////////////////////////////////////////////////////////////////////////////// - -impl< - D: Deserializer, - E, -> Deserialize for () { - fn deserialize(d: &mut D) -> Result<(), E> { - struct Visitor; - - impl, E> self::Visitor for Visitor { - fn visit_null(&mut self, _d: &mut D) -> Result<(), E> { - Ok(()) - } - } - - d.visit(&mut Visitor) - } -} - -/////////////////////////////////////////////////////////////////////////////// - -impl< - D: Deserializer, - E, -> Deserialize for int { - fn deserialize(d: &mut D) -> Result { - struct Visitor; - - impl, E> self::Visitor for Visitor { - fn visit_int(&mut self, _d: &mut D, v: int) -> Result { - Ok(v) - } - } - - d.visit(&mut Visitor) - } -} - -/////////////////////////////////////////////////////////////////////////////// - -impl< - D: Deserializer, - E, -> Deserialize for String { - fn deserialize(d: &mut D) -> Result { - struct Visitor; - - impl, E> self::Visitor for Visitor { - fn visit_string(&mut self, _d: &mut D, v: String) -> Result { - Ok(v) - } - } - - d.visit(&mut Visitor) - } -} - -/////////////////////////////////////////////////////////////////////////////// - -impl< - T: Deserialize, - D: Deserializer, - E, -> Deserialize for Option { - fn deserialize(d: &mut D) -> Result, E> { - struct Visitor; - - impl< - T: Deserialize, - D: Deserializer, - E, - > self::Visitor, E> for Visitor { - fn visit_option< - V: OptionVisitor, - >(&mut self, d: &mut D, mut visitor: V) -> Result, E> { - visitor.visit(d) - } - } - - d.visit_option(&mut Visitor) - } -} - -/////////////////////////////////////////////////////////////////////////////// - -impl< - T: Deserialize, - D: Deserializer, - E, -> Deserialize for Vec { - fn deserialize(d: &mut D) -> Result, E> { - struct Visitor; - - impl< - T: Deserialize, - D: Deserializer, - E, - > self::Visitor, E> for Visitor { - fn visit_seq< - V: SeqVisitor, - >(&mut self, d: &mut D, mut visitor: V) -> Result, E> { - let (len, _) = visitor.size_hint(d); - let mut values = Vec::with_capacity(len); - - loop { - match try!(visitor.visit(d)) { - Some(value) => { - values.push(value); - } - None => { - break; - } - } - } - - Ok(values) - } - } - - d.visit(&mut Visitor) - } -} - -impl< - T0: Deserialize, - T1: Deserialize, - D: Deserializer, - E, -> Deserialize for (T0, T1) { - fn deserialize(d: &mut D) -> Result<(T0, T1), E> { - struct Visitor; - - impl< - T0: Deserialize, - T1: Deserialize, - D: Deserializer, - E, - > self::Visitor for Visitor { - fn visit_seq< - V: SeqVisitor, - >(&mut self, d: &mut D, mut visitor: V) -> Result<(T0, T1), E> { - let mut state = 0u; - let mut t0 = None; - let mut t1 = None; - - loop { - match state { - 0 => { - state += 1; - match try!(visitor.visit(d)) { - Some(value) => { - t0 = Some(value); - } - None => { - return Err(d.end_of_stream_error()); - } - } - } - 1 => { - state += 1; - match try!(visitor.visit(d)) { - Some(value) => { - t1 = Some(value); - } - None => { - return Err(d.end_of_stream_error()); - } - } - } - _ => { - try!(visitor.end(d)); - - return Ok((t0.unwrap(), t1.unwrap())); - } - } - } - } - } - - d.visit(&mut Visitor) - } -} - -/////////////////////////////////////////////////////////////////////////////// - -impl< - K: Deserialize + Eq + Hash, - V: Deserialize, - D: Deserializer, - E, -> Deserialize for HashMap { - fn deserialize(d: &mut D) -> Result, E> { - struct Visitor; - - impl< - K: Deserialize + Eq + Hash, - V: Deserialize, - D: Deserializer, - E, - > self::Visitor, E> for Visitor { - fn visit_map< - Visitor: MapVisitor, - >(&mut self, d: &mut D, mut visitor: Visitor) -> Result, E> { - let (len, _) = visitor.size_hint(d); - let mut values = HashMap::with_capacity(len); - - loop { - match try!(visitor.visit(d)) { - Some((key, value)) => { - values.insert(key, value); - } - None => { - break; - } - } - } - - Ok(values) - } - } - - d.visit(&mut Visitor) - } -} - -impl< - K: Deserialize + Eq + Ord, - V: Deserialize, - D: Deserializer, - E, -> Deserialize for TreeMap { - fn deserialize(d: &mut D) -> Result, E> { - struct Visitor; - - impl< - K: Deserialize + Eq + Ord, - V: Deserialize, - D: Deserializer, - E, - > self::Visitor, E> for Visitor { - fn visit_map< - Visitor: MapVisitor, - >(&mut self, d: &mut D, mut visitor: Visitor) -> Result, E> { - let mut values = TreeMap::new(); - - loop { - match try!(visitor.visit(d)) { - Some((key, value)) => { - values.insert(key, value); - } - None => { - break; - } - } - } - - Ok(values) - } - } - - d.visit(&mut Visitor) - } -} diff --git a/serde2/src/lib.rs b/serde2/src/lib.rs index a5a0bbd5..91df934f 100644 --- a/serde2/src/lib.rs +++ b/serde2/src/lib.rs @@ -5,6 +5,5 @@ //pub use ser::GatherTokens; pub mod ser; -//pub mod de; -pub mod de2; +pub mod de; //pub mod json;