From 9a622ddad5e8edaf62beb1083c9433ccead11c82 Mon Sep 17 00:00:00 2001 From: Sam Scott Date: Sun, 28 May 2017 22:55:46 +0100 Subject: Create correct level type when parsing a nested ordered seq. Fixes #7. --- src/de/parse.rs | 6 ++++-- tests/test_deserialize.rs | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/de/parse.rs b/src/de/parse.rs index b9f2b35..e015d94 100644 --- a/src/de/parse.rs +++ b/src/de/parse.rs @@ -346,7 +346,7 @@ impl> Parser { }, b'[' => { if let Level::Invalid(_) = *node { - *node = Level::Nested(BTreeMap::default()); + *node = Level::OrderedSeq(BTreeMap::default()); } if let Level::OrderedSeq(ref mut map) = *node { self.depth -= 1; @@ -398,7 +398,7 @@ impl> Parser { }, // First character is an integer, attempt to parse it as an integer key - 0x30...0x39 => { + b'0'...b'9' => { let key = self.parse_key(b']', true)?; let key = usize::from_str_radix(&key, 10).map_err(Error::from)?; self.parse_ord_seq_value(key, node)?; @@ -419,6 +419,8 @@ impl> Parser { }, // This means the key should be a root key // of the form "abc" or "abc[...]" + // We do actually allow integer keys here since they cannot + // be confused with sequences 0x20...0x5a | 0x5c...0x7e => { let key = self.parse_key(b'[', false)?; self.parse_map_value(key, node)?; diff --git a/tests/test_deserialize.rs b/tests/test_deserialize.rs index 20a573c..6d5cc9b 100644 --- a/tests/test_deserialize.rs +++ b/tests/test_deserialize.rs @@ -360,3 +360,22 @@ fn deserialize_enum() { let rec_params: E = qs::from_str(params).unwrap(); assert_eq!(rec_params, E::S("Hello World".to_string())); } + +#[test] +fn seq_of_struct() { + + #[derive(Deserialize, Debug, PartialEq)] + struct Test { + a: u8 + } + #[derive(Deserialize, Debug, PartialEq)] + struct Query { + b: Vec, + } + + let params = "b[0][a]=1&b[1][a]=2"; + let rec_params: Query = qs::from_str(params).unwrap(); + assert_eq!(rec_params, + Query { b: vec![Test { a: 1 }, Test { a: 2 }] } + ); +} \ No newline at end of file -- cgit v1.2.3