From 0b6556eacaf8f16312487594a0888bfe79723748 Mon Sep 17 00:00:00 2001 From: Michal 'vorner' Vaner Date: Mon, 5 Aug 2019 18:38:12 +0200 Subject: Allow arbitrary types of map keys Of particular interest are maps that have numbers or enums as keys. Closes #74. --- src/de.rs | 2 +- tests/Settings.toml | 11 +++++++++++ tests/get.rs | 41 ++++++++++++++++++++++++++++++++++++++++- 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, + // Just to make sure that set keys work too. + quarks: HashSet, + } + + 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, + } + + let c = make(); + let s: Settings = c.try_into().unwrap(); + assert_eq!(s.divisors[&4], 3); + assert_eq!(s.divisors.len(), 4); +} -- cgit v1.2.3