summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichal 'vorner' Vaner <vorner@vorner.cz>2019-08-05 18:38:12 +0200
committerMichal 'vorner' Vaner <vorner@vorner.cz>2019-08-22 20:35:28 +0200
commit0b6556eacaf8f16312487594a0888bfe79723748 (patch)
tree96afc714a1713154f4c7aa17cc147088497a2811
parentad29f8f83566366671e6affd3887079d7165f5f9 (diff)
Allow arbitrary types of map keys
Of particular interest are maps that have numbers or enums as keys. Closes #74.
-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 9611a21..6cdd689 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 7e3be8a..acc823d 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 {
@@ -225,3 +225,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);
+}