diff --git a/de.rs b/de.rs index f4797309..cd17b1e3 100644 --- a/de.rs +++ b/de.rs @@ -161,7 +161,7 @@ pub trait Deserializer: Iterator> { } #[inline] - fn expect_seq< + fn expect_collection< T: Deserializable, C: FromIterator >(&mut self) -> Result { @@ -174,26 +174,19 @@ pub trait Deserializer: Iterator> { MapStart(len) => len }; - let iter = self.by_ref().batch(|d| { - let d = d.iter(); + expect_rest_of_collection(self, len) + } - let token = match d.next() { - Some(token) => token, - None => { return None; } - }; + #[inline] + fn expect_seq< + T: Deserializable, + C: FromIterator + >(&mut self) -> Result { + let len = match_token! { + SeqStart(len) => len + }; - match token { - Ok(Sep) => { - let value: Result = Deserializable::deserialize(d); - Some(value) - } - Ok(End) => None, - Ok(_) => Some(Err(d.syntax_error())), - Err(e) => Some(Err(e)), - } - }); - - result::collect_with_capacity(iter, len) + expect_rest_of_collection(self, len) } #[inline] @@ -202,36 +195,11 @@ pub trait Deserializer: Iterator> { V: Deserializable, C: FromIterator<(K, V)> >(&mut self) -> Result { - // By default we don't care what our source input was. We can take - // anything that's a Collection<(K, V)>.We'll error out later if the types - // are wrong. - let len = match_token! { - TupleStart(len) => len, - VecStart(len) => len, MapStart(len) => len }; - let iter = self.by_ref().batch(|d| { - let d = d.iter(); - - let token = match d.next() { - Some(token) => token, - None => { return None; } - }; - - match token { - Ok(Sep) => { - let kv: Result<(K, V), E> = Deserializable::deserialize(d); - Some(kv) - } - Ok(End) => None, - Ok(_) => Some(Err(d.syntax_error())), - Err(e) => Some(Err(e)), - } - }); - - result::collect_with_capacity(iter, len) + expect_rest_of_collection(self, len) } #[inline] @@ -244,6 +212,36 @@ pub trait Deserializer: Iterator> { ////////////////////////////////////////////////////////////////////////////// +fn expect_rest_of_collection< + E, + D: Deserializer, + T: Deserializable, + C: FromIterator +>(d: &mut D, len: uint) -> Result { + let iter = d.by_ref().batch(|d| { + let d = d.iter(); + + let token = match d.next() { + Some(token) => token, + None => { return None; } + }; + + match token { + Ok(Sep) => { + let value: Result = Deserializable::deserialize(d); + Some(value) + } + Ok(End) => None, + Ok(_) => Some(Err(d.syntax_error())), + Err(e) => Some(Err(e)), + } + }); + + result::collect_with_capacity(iter, len) +} + +////////////////////////////////////////////////////////////////////////////// + pub trait Deserializable> { fn deserialize(d: &mut D) -> Result; } @@ -352,12 +350,10 @@ macro_rules! deserialize_tuple ( try!(d.expect_tuple_start(len)); - let result = ($( - { - let $name = try!(d.expect_tuple_elt()); - $name - } - ,)*); + let result = ($({ + let $name = try!(d.expect_tuple_elt()); + $name + },)*); try!(d.expect_end());