diff options
author | Matthias Beyer <mail@beyermatthias.de> | 2022-06-21 11:38:27 +0200 |
---|---|---|
committer | Matthias Beyer <mail@beyermatthias.de> | 2022-06-21 11:38:27 +0200 |
commit | 252c008cd4313b2832bb24e972336436ff137de3 (patch) | |
tree | 77fd8abd941a66f87941d523eb22b0e3b4755d40 | |
parent | f23faff0c2a27abe5e136e21d3f0b3870a5dd1a5 (diff) |
Add test for nested TOML configuration
Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
-rw-r--r-- | src/element/mod.rs | 52 |
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); + } +} |