use super::niche_config_data::NicheConfigData;
use std::fmt::Debug;
use crate::config_model::UseThundercloudConfig;
use crate::file_system::ConfigFormat;
pub trait NicheConfig : Sized + Debug {
fn from_str(body: &str, config_format: ConfigFormat) -> Result<Self>;
fn use_thundercloud(&self) -> &impl UseThundercloudConfig;
}
use super::*;
pub fn from_str(body: &str, config_format: ConfigFormat) -> Result<impl NicheConfig> {
NicheConfigData::from_str(body, config_format)
}
#[cfg(test)]
pub mod test {
use super::*;
use super::serde_test_utils::insert_entry;
use super::OnIncoming::Update;
use super::WriteMode::Ignore;
use indoc::indoc;
use log::debug;
use test_log::test;
use toml::Table;
#[test]
pub fn test_from_reader() -> Result<()> {
let toml_data = indoc! {r#"
[use-thundercloud]
directory = "{{PROJECT}}/example-thundercloud"
on-incoming = "Update"
features = ["glass", "bash_config", "kermie"]
[use-thundercloud.invar-defaults]
write-mode = "Ignore"
interpolate = false
[use-thundercloud.invar-defaults.props]
marthter = "Jeremy"
buyer = "Myra LeJean"
milk-man = "Kaos"
"#};
debug!("TOML: [[[\n{}\n]]]", &toml_data);
let niche_config = from_str(toml_data, ConfigFormat::TOML)?;
let use_thundercloud = niche_config.use_thundercloud();
assert_eq!(use_thundercloud.directory(), Some("{{PROJECT}}/example-thundercloud"));
assert_eq!(use_thundercloud.on_incoming(), &Update);
assert_eq!(use_thundercloud.features(), &["glass", "bash_config", "kermie"]);
let invar_defaults = use_thundercloud.invar_defaults().into_owned();
let invar_defaults_state = invar_defaults.clone_state();
assert_eq!(invar_defaults_state.write_mode_option(), Some(Ignore));
assert_eq!(invar_defaults_state.interpolate_option(), Some(false));
let mut mapping = Table::new();
insert_entry(&mut mapping, "marthter", "Jeremy");
insert_entry(&mut mapping, "buyer", "Myra LeJean");
insert_entry(&mut mapping, "milk-man", "Kaos");
assert_eq!(invar_defaults_state.props().into_owned(), mapping);
Ok(())
}
}