diff options
-rw-r--r-- | src/de.rs | 29 | ||||
-rw-r--r-- | tests/test_deserialize.rs | 47 |
2 files changed, 65 insertions, 11 deletions
@@ -568,10 +568,19 @@ impl de::Deserializer for LevelDeserializer { fn deserialize<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor, { - if let Level::Flat(x) = self.0 { - x.into_deserializer().deserialize(visitor) - } else { - Err(de::Error::custom("cannot deserialize value")) + match self.0 { + Level::Nested(map) => { + Deserializer::with_map(map).deserialize_map(visitor) + }, + Level::Sequence(seq) => { + SeqDeserializer::new(seq.into_iter()).deserialize(visitor) + }, + Level::Flat(x) => { + x.into_deserializer().deserialize(visitor) + }, + Level::Invalid(e) => { + Err(de::Error::custom(e)) + } } } @@ -631,14 +640,12 @@ impl de::Deserializer for LevelDeserializer { where V: de::Visitor, { match self.0 { - Level::Flat(x) => { - if x == "" { - visitor.visit_none() - } else { - visitor.visit_some(x.into_deserializer()) - } + Level::Flat(ref x) if x == "" => { + visitor.visit_none() + }, + _ => { + visitor.visit_some(self) }, - _ => Err(de::Error::custom("value does not appear to be a value")), } } diff --git a/tests/test_deserialize.rs b/tests/test_deserialize.rs index dc93bd5..9ef164c 100644 --- a/tests/test_deserialize.rs +++ b/tests/test_deserialize.rs @@ -192,3 +192,50 @@ fn qs_nesting() { map_test!("a[b][c][d][e][f][g][h]=i", "a"["b"["c"["d"["e"["[f][g][h]"["i"]]]]]]); } + +#[test] +fn optional_seq() { + #[derive(Debug,Serialize,Deserialize,PartialEq)] + struct Query { + vec: Option<Vec<u8>>, + } + + let params = "vec="; + let query = Query { + vec: None, + }; + let rec_params: Query = qs::from_str(params).unwrap(); + assert_eq!(rec_params, query); + + let params = "vec[0]=1&vec[1]=2"; + let query = Query { + vec: Some(vec![1,2]), + }; + let rec_params: Query = qs::from_str(params).unwrap(); + assert_eq!(rec_params, query); +} + +#[test] +fn optional_struct() { + #[derive(Debug,Serialize,Deserialize,PartialEq)] + struct Query { + address: Option<Address>, + } + + let params = "address="; + let query = Query { + address: None, + }; + let rec_params: Query = qs::from_str(params).unwrap(); + assert_eq!(rec_params, query); + + let params = "address[city]=Carrot+City&address[postcode]=12345"; + let query = Query { + address: Some(Address { + city: "Carrot City".to_string(), + postcode: "12345".to_string(), + },), + }; + let rec_params: Query = qs::from_str(params).unwrap(); + assert_eq!(rec_params, query); +} |