summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Beyer <mail@beyermatthias.de>2022-06-21 11:38:27 +0200
committerMatthias Beyer <mail@beyermatthias.de>2022-06-21 11:38:27 +0200
commit252c008cd4313b2832bb24e972336436ff137de3 (patch)
tree77fd8abd941a66f87941d523eb22b0e3b4755d40
parentf23faff0c2a27abe5e136e21d3f0b3870a5dd1a5 (diff)
Add test for nested TOML configuration
Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
-rw-r--r--src/element/mod.rs52
1 files changed, 51 insertions, 1 deletions
diff --git a/src/element/mod.rs b/src/element/mod.rs
index a7568af..a92de51 100644
--- a/src/element/mod.rs
+++ b/src/element/mod.rs
@@ -67,7 +67,18 @@ impl<'a> ConfigElement<'a> {
(Some(AccessType::Key(k)), ConfigElement::List(_)) => {
Err(ConfigObjectAccessError::AccessWithKeyOnList(k.to_string()))
}
- (Some(AccessType::Key(k)), ConfigElement::Map(hm)) => Ok(hm.get(k.as_str())),
+ (Some(AccessType::Key(k)), ConfigElement::Map(hm)) => {
+ if let Some(value) = hm.get(k.as_str()) {
+ accessor.advance();
+ if accessor.current().is_none() {
+ return Ok(Some(value))
+ } else {
+ value.get(accessor)
+ }
+ } else {
+ Ok(None)
+ }
+ },
(Some(AccessType::Index(u)), ConfigElement::Null) => {
Err(ConfigObjectAccessError::AccessWithIndexOnNull(*u))
@@ -130,3 +141,42 @@ pub mod json;
#[cfg(feature = "toml")]
pub mod toml;
+#[cfg(test)]
+mod tests {
+ #[test]
+ #[cfg(feature = "toml")]
+ fn test_nested_toml_config() {
+ use crate::Config;
+ use crate::element::AsConfigElement;
+ use crate::element::ConfigElement;
+
+ let toml: toml::Value = toml::from_str(r#"
+ key1 = "value2"
+
+ [table]
+ key2 = "value3"
+ "#).unwrap();
+ let toml = std::sync::Arc::new(toml);
+
+ let source = crate::source::test_source::TestSource(|| toml.as_config_element().unwrap());
+
+ let c = Config::builder()
+ .load(&source)
+ .unwrap()
+ .build();
+
+ let r = c.get("key1");
+ assert!(r.is_ok());
+ let r = r.unwrap();
+ assert!(r.is_some());
+ let r = r.unwrap();
+ assert!(std::matches!(r, ConfigElement::Str("value2")));
+
+ let r = c.get("table.key2");
+ assert!(r.is_ok());
+ let r = r.unwrap();
+ assert!(r.is_some());
+ let r = r.unwrap();
+ assert!(std::matches!(r, ConfigElement::Str("value3")), "{:?} != value3", r);
+ }
+}