aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Crichton <alex@alexcrichton.com>2014-12-12 13:26:49 -0800
committerAlex Crichton <alex@alexcrichton.com>2014-12-12 13:30:40 -0800
commit944b94c21a064d0b1ad80ccabf12d95726c72139 (patch)
tree086b2f3d3c7750e57d39b405a127cd3b4fa56263
parent4dce070c70d758f586a8f481f9fb2237f7633a58 (diff)
downloadmilf-rs-944b94c21a064d0b1ad80ccabf12d95726c72139.tar.gz
milf-rs-944b94c21a064d0b1ad80ccabf12d95726c72139.zip
Handle deserializing empty or missing arrays
-rw-r--r--src/serialization.rs32
1 files changed, 31 insertions, 1 deletions
diff --git a/src/serialization.rs b/src/serialization.rs
index 457f361..829d89a 100644
--- a/src/serialization.rs
+++ b/src/serialization.rs
@@ -260,7 +260,6 @@ impl serialize::Encoder<Error> for Encoder {
let old = mem::replace(&mut self.state, NextKey(f_name.to_string()));
try!(f(self));
if self.state != Start {
- println!("{}", self.state);
return Err(NoValue)
}
self.state = old;
@@ -636,6 +635,7 @@ impl serialize::Decoder<DecodeError> for Decoder {
{
let len = match self.toml {
Some(Array(ref arr)) => arr.len(),
+ None => 0,
ref found => return Err(self.mismatch("array", found)),
};
let ret = try!(f(self, len));
@@ -1236,4 +1236,34 @@ mod tests {
})])
})));
}
+
+ #[test]
+ fn empty_arrays() {
+ #[deriving(Encodable, Decodable, PartialEq, Show)]
+ struct Foo { a: Vec<Bar> }
+ #[deriving(Encodable, Decodable, PartialEq, Show)]
+ struct Bar;
+
+ let v = Foo { a: vec![] };
+ let mut d = Decoder::new(Table(map! {}));
+ assert_eq!(v, Decodable::decode(&mut d).unwrap());
+ }
+
+ #[test]
+ fn empty_arrays2() {
+ #[deriving(Encodable, Decodable, PartialEq, Show)]
+ struct Foo { a: Option<Vec<Bar>> }
+ #[deriving(Encodable, Decodable, PartialEq, Show)]
+ struct Bar;
+
+ let v = Foo { a: None };
+ let mut d = Decoder::new(Table(map! {}));
+ assert_eq!(v, Decodable::decode(&mut d).unwrap());
+
+ let v = Foo { a: Some(vec![]) };
+ let mut d = Decoder::new(Table(map! {
+ a: Array(vec![])
+ }));
+ assert_eq!(v, Decodable::decode(&mut d).unwrap());
+ }
}