summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYounessBird <67457600+YounessBird@users.noreply.github.com>2022-06-01 19:15:43 +0100
committerYounessBird <67457600+YounessBird@users.noreply.github.com>2022-06-01 22:04:20 +0100
commit2b2966611b70485e184178d0c43ed340e8991593 (patch)
tree57398f49d080eae695880bf1fde89db830896776
parentc8ee9f1335fb093cda3debabe15ad0f7a3ab9071 (diff)
fix yaml to parse int keys
-rw-r--r--src/file/format/yaml.rs9
-rw-r--r--tests/file_yaml.rs29
-rw-r--r--tests/test-keys.yaml8
3 files changed, 42 insertions, 4 deletions
diff --git a/src/file/format/yaml.rs b/src/file/format/yaml.rs
index 2a76261..c9c8a22 100644
--- a/src/file/format/yaml.rs
+++ b/src/file/format/yaml.rs
@@ -51,10 +51,11 @@ fn from_yaml_value(
yaml::Yaml::Hash(ref table) => {
let mut m = Map::new();
for (key, value) in table {
- if let Some(k) = key.as_str() {
- m.insert(k.to_owned(), from_yaml_value(uri, value)?);
- }
- // TODO: should we do anything for non-string keys?
+ match key {
+ yaml::Yaml::String(k) => m.insert(k.to_owned(), from_yaml_value(uri, value)?),
+ yaml::Yaml::Integer(k) => m.insert(k.to_string(), from_yaml_value(uri, value)?),
+ _ => unreachable!(),
+ };
}
Ok(Value::new(uri, ValueKind::Table(m)))
}
diff --git a/tests/file_yaml.rs b/tests/file_yaml.rs
index 233b92c..0ece482 100644
--- a/tests/file_yaml.rs
+++ b/tests/file_yaml.rs
@@ -91,3 +91,32 @@ fn test_error_parse() {
)
);
}
+
+use std::collections::HashMap;
+
+#[derive(Debug, Deserialize)]
+struct Outer {
+ inner_string: HashMap<String, Inner>,
+ inner_int: HashMap<u32, Inner>,
+}
+
+#[derive(Debug, Deserialize)]
+struct Inner {
+ member: String,
+}
+
+#[test]
+fn test_yaml_parsing_key() {
+ let config = Config::builder()
+ .add_source(File::new("tests/test-keys.yaml", FileFormat::Yaml))
+ .build()
+ .unwrap()
+ .try_deserialize::<Outer>()
+ .unwrap();
+ assert_eq!(config.inner_int.get(&1).unwrap().member, "Test Int 1");
+ assert_eq!(config.inner_int.get(&2).unwrap().member, "Test Int 2");
+ assert_eq!(
+ config.inner_string.get("str_key").unwrap().member,
+ "Test String"
+ );
+}
diff --git a/tests/test-keys.yaml b/tests/test-keys.yaml
new file mode 100644
index 0000000..b026ae5
--- /dev/null
+++ b/tests/test-keys.yaml
@@ -0,0 +1,8 @@
+inner_int:
+ "1":
+ member: "Test Int 1"
+ 2:
+ member: "Test Int 2"
+inner_string:
+ str_key:
+ member: "Test String"