diff options
author | Pouya Mobasher Behrouz <pooyamb@gmail.com> | 2020-12-07 05:38:11 +0330 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-12-06 21:08:11 -0500 |
commit | 17642c3735e3a8474919284a15df94ccec9e4da6 (patch) | |
tree | abd22c56c4df2970fcf8561cffdab1976735203a | |
parent | f4a0126e62aa87e6a639583ed53aac7655a3f60f (diff) |
Support enum unit variants as map keys (#37)
-rw-r--r-- | src/de/mod.rs | 13 | ||||
-rw-r--r-- | src/ser.rs | 5 | ||||
-rw-r--r-- | tests/test_deserialize.rs | 18 | ||||
-rw-r--r-- | tests/test_serialize.rs | 25 |
4 files changed, 57 insertions, 4 deletions
diff --git a/src/de/mod.rs b/src/de/mod.rs index 3d8b508..62da6a5 100644 --- a/src/de/mod.rs +++ b/src/de/mod.rs @@ -654,6 +654,18 @@ impl<'de> de::Deserializer<'de> for ParsableStringDeserializer<'de> { self.0.into_deserializer().deserialize_any(visitor) } + fn deserialize_enum<V>( + self, + _: &'static str, + _: &'static [&'static str], + visitor: V, + ) -> Result<V::Value> + where + V: de::Visitor<'de>, + { + visitor.visit_enum(LevelDeserializer(Level::Flat(self.0))) + } + forward_to_deserialize_any! { map struct @@ -670,7 +682,6 @@ impl<'de> de::Deserializer<'de> for ParsableStringDeserializer<'de> { tuple_struct identifier tuple - enum ignored_any } @@ -524,14 +524,13 @@ impl ser::Serializer for StringSerializer { Err(Error::Unsupported) } - /// Returns an error. fn serialize_unit_variant( self, _name: &'static str, _variant_index: u32, - _variant: &'static str, + variant: &'static str, ) -> Result<Self::Ok> { - Err(Error::Unsupported) + Ok(variant.to_string()) } /// Returns an error. diff --git a/tests/test_deserialize.rs b/tests/test_deserialize.rs index 8d518ee..f0ccee9 100644 --- a/tests/test_deserialize.rs +++ b/tests/test_deserialize.rs @@ -640,5 +640,23 @@ fn deserialize_plus() { #[test] fn deserialize_vec_of_structs() { +} + +#[test] +fn deserialize_map_with_unit_enum_keys() { + #[derive(Deserialize, Eq, PartialEq, Hash)] + enum Operator { + Lt, + Gt, + } + + #[derive(Deserialize)] + struct Filter { + point: HashMap<Operator, u64>, + } + + let test: Filter = serde_qs::from_str("point[Gt]=123&point[Lt]=321").unwrap(); + assert_eq!(test.point[&Operator::Gt], 123); + assert_eq!(test.point[&Operator::Lt], 321); } diff --git a/tests/test_serialize.rs b/tests/test_serialize.rs index f650beb..8aecfe3 100644 --- a/tests/test_serialize.rs +++ b/tests/test_serialize.rs @@ -131,3 +131,28 @@ fn serialize_flatten() { let rec_params = qs::to_string(&query).unwrap(); assert_eq!(rec_params, params); } + +#[test] +fn serialize_map_with_unit_enum_keys() { + use std::collections::HashMap; + + #[derive(Serialize, Eq, PartialEq, Hash)] + enum Operator { + Lt, + Gt, + } + + #[derive(Serialize)] + struct Filter { + point: HashMap<Operator, u64>, + } + + let mut map = HashMap::new(); + map.insert(Operator::Gt, 123); + map.insert(Operator::Lt, 321); + let test = Filter { point: map }; + + let query = qs::to_string(&test).unwrap(); + + assert!(query == "point[Lt]=321&point[Gt]=123" || query == "point[Gt]=123&point[Lt]=321"); +} |