summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRyan Leckey <ryan@launchbadge.com>2019-12-07 18:19:45 -0800
committerGitHub <noreply@github.com>2019-12-07 18:19:45 -0800
commite9729be38ffcfbe53dc64d9cbdfbe50031b54b42 (patch)
tree263c50b49a6b2bc264f44de3a69574d1096e16f7
parentc8da0a5d3ef24bbf55a5b6dcffec2fa21f014ee3 (diff)
parent0b6556eacaf8f16312487594a0888bfe79723748 (diff)
Merge pull request #119 from vorner/universal-map-keys
Allow arbitrary types of map keys
-rw-r--r--src/de.rs2
-rw-r--r--tests/Settings.toml11
-rw-r--r--tests/get.rs41
3 files changed, 52 insertions, 2 deletions
diff --git a/src/de.rs b/src/de.rs
index 215b97c..3c9e210 100644
--- a/src/de.rs
+++ b/src/de.rs
@@ -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);
+}