diff options
author | Ryan Leckey <ryan@launchbadge.com> | 2019-12-07 18:19:45 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-12-07 18:19:45 -0800 |
commit | e9729be38ffcfbe53dc64d9cbdfbe50031b54b42 (patch) | |
tree | 263c50b49a6b2bc264f44de3a69574d1096e16f7 | |
parent | c8da0a5d3ef24bbf55a5b6dcffec2fa21f014ee3 (diff) | |
parent | 0b6556eacaf8f16312487594a0888bfe79723748 (diff) |
Merge pull request #119 from vorner/universal-map-keys
Allow arbitrary types of map keys
-rw-r--r-- | src/de.rs | 2 | ||||
-rw-r--r-- | tests/Settings.toml | 11 | ||||
-rw-r--r-- | tests/get.rs | 41 |
3 files changed, 52 insertions, 2 deletions
@@ -215,7 +215,7 @@ impl<'de> de::MapAccess<'de> for MapAccess { K: de::DeserializeSeed<'de>, { if let Some(&(ref key_s, _)) = self.elements.front() { - let key_de = StrDeserializer(key_s); + let key_de = Value::new(None, key_s as &str); let key = de::DeserializeSeed::deserialize(seed, key_de)?; Ok(Some(key)) diff --git a/tests/Settings.toml b/tests/Settings.toml index 26e6d26..bafb319 100644 --- a/tests/Settings.toml +++ b/tests/Settings.toml @@ -9,6 +9,7 @@ code = 53 boolean_s_parse = "fals" arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] +quarks = ["up", "down", "strange", "charm", "bottom", "top"] [diodes] green = "off" @@ -40,3 +41,13 @@ rating = 4.5 [place.creator] name = "John Smith" + +[proton] +up = 2 +down = 1 + +[divisors] +1 = 1 +2 = 2 +4 = 3 +5 = 2 diff --git a/tests/get.rs b/tests/get.rs index bf3ba78..a5fea69 100644 --- a/tests/get.rs +++ b/tests/get.rs @@ -9,7 +9,7 @@ extern crate serde_derive; use config::*; use float_cmp::ApproxEqUlps; -use std::collections::HashMap; +use std::collections::{HashMap, HashSet}; #[derive(Debug, Deserialize)] struct Place { @@ -226,3 +226,42 @@ fn test_enum() { assert_eq!(s.diodes["blue"], Diode::Blinking(300, 700)); assert_eq!(s.diodes["white"], Diode::Pattern{name: "christmas".into(), inifinite: true,}); } + +#[test] +fn test_enum_key() { + #[derive(Debug, Deserialize, PartialEq, Eq, Hash)] + enum Quark { + Up, + Down, + Strange, + Charm, + Bottom, + Top, + } + + #[derive(Debug, Deserialize)] + struct Settings { + proton: HashMap<Quark, usize>, + // Just to make sure that set keys work too. + quarks: HashSet<Quark>, + } + + let c = make(); + let s: Settings = c.try_into().unwrap(); + + assert_eq!(s.proton[&Quark::Up], 2); + assert_eq!(s.quarks.len(), 6); +} + +#[test] +fn test_int_key() { + #[derive(Debug, Deserialize, PartialEq)] + struct Settings { + divisors: HashMap<u32, u32>, + } + + let c = make(); + let s: Settings = c.try_into().unwrap(); + assert_eq!(s.divisors[&4], 3); + assert_eq!(s.divisors.len(), 4); +} |