Skip to content

Commit e9729be

Browse files
authored
Merge pull request #119 from vorner/universal-map-keys
Allow arbitrary types of map keys
2 parents c8da0a5 + 0b6556e commit e9729be

File tree

3 files changed

+52
-2
lines changed

3 files changed

+52
-2
lines changed

src/de.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ impl<'de> de::MapAccess<'de> for MapAccess {
215215
K: de::DeserializeSeed<'de>,
216216
{
217217
if let Some(&(ref key_s, _)) = self.elements.front() {
218-
let key_de = StrDeserializer(key_s);
218+
let key_de = Value::new(None, key_s as &str);
219219
let key = de::DeserializeSeed::deserialize(seed, key_de)?;
220220

221221
Ok(Some(key))

tests/Settings.toml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ code = 53
99
boolean_s_parse = "fals"
1010

1111
arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
12+
quarks = ["up", "down", "strange", "charm", "bottom", "top"]
1213

1314
[diodes]
1415
green = "off"
@@ -40,3 +41,13 @@ rating = 4.5
4041

4142
[place.creator]
4243
name = "John Smith"
44+
45+
[proton]
46+
up = 2
47+
down = 1
48+
49+
[divisors]
50+
1 = 1
51+
2 = 2
52+
4 = 3
53+
5 = 2

tests/get.rs

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ extern crate serde_derive;
99

1010
use config::*;
1111
use float_cmp::ApproxEqUlps;
12-
use std::collections::HashMap;
12+
use std::collections::{HashMap, HashSet};
1313

1414
#[derive(Debug, Deserialize)]
1515
struct Place {
@@ -226,3 +226,42 @@ fn test_enum() {
226226
assert_eq!(s.diodes["blue"], Diode::Blinking(300, 700));
227227
assert_eq!(s.diodes["white"], Diode::Pattern{name: "christmas".into(), inifinite: true,});
228228
}
229+
230+
#[test]
231+
fn test_enum_key() {
232+
#[derive(Debug, Deserialize, PartialEq, Eq, Hash)]
233+
enum Quark {
234+
Up,
235+
Down,
236+
Strange,
237+
Charm,
238+
Bottom,
239+
Top,
240+
}
241+
242+
#[derive(Debug, Deserialize)]
243+
struct Settings {
244+
proton: HashMap<Quark, usize>,
245+
// Just to make sure that set keys work too.
246+
quarks: HashSet<Quark>,
247+
}
248+
249+
let c = make();
250+
let s: Settings = c.try_into().unwrap();
251+
252+
assert_eq!(s.proton[&Quark::Up], 2);
253+
assert_eq!(s.quarks.len(), 6);
254+
}
255+
256+
#[test]
257+
fn test_int_key() {
258+
#[derive(Debug, Deserialize, PartialEq)]
259+
struct Settings {
260+
divisors: HashMap<u32, u32>,
261+
}
262+
263+
let c = make();
264+
let s: Settings = c.try_into().unwrap();
265+
assert_eq!(s.divisors[&4], 3);
266+
assert_eq!(s.divisors.len(), 4);
267+
}

0 commit comments

Comments
 (0)