use super::*;
use crate::config_model::thundercloud_config_data::ThundercloudConfigData;
use crate::file_system::ConfigFormat;
use crate::NicheName;
pub fn from_str(body: &str, config_format: ConfigFormat) -> Result<ThundercloudConfigData> {
ThundercloudConfigData::from_str(body, config_format)
}
pub fn from_niche(niche: &NicheName) -> ThundercloudConfigData {
ThundercloudConfigData::from(niche)
}
pub trait ThundercloudConfig: Debug + Sized {
type InvarConfigImpl: InvarConfig;
fn from_str(toml_data: &str, config_format: ConfigFormat) -> Result<Self>;
fn niche(&self) -> &impl NicheDescription;
fn invar_defaults<'a>(&'a self) -> Cow<'a, Self::InvarConfigImpl>;
}
#[cfg(test)]
mod test {
use super::*;
use crate::config_model::serde_test_utils::insert_entry;
use crate::config_model::WriteMode::Overwrite;
use anyhow::Result;
use indoc::indoc;
use log::debug;
use test_log::test;
use toml::Table;
#[test]
fn test_from_str() -> Result<()> {
let toml = indoc! {r#"
[niche]
name = "example"
description = "Example thundercloud"
[invar-defaults]
write-mode = "Overwrite"
interpolate = true
[invar-defaults.props]
alter-ego = "Lobsang"
milk-man = "Ronny Soak"
"#};
debug!("TOML: [{}]", &toml);
let thundercloud_config = from_str(toml, ConfigFormat::TOML)?;
assert_eq!(thundercloud_config.niche().name(), "example");
assert_eq!(
thundercloud_config.niche().description(),
Some("Example thundercloud")
);
let invar_defaults = thundercloud_config.invar_defaults().into_owned();
let invar_defaults_state = invar_defaults.clone_state();
assert_eq!(invar_defaults_state.write_mode(), Overwrite);
assert_eq!(invar_defaults_state.interpolate_option(), Some(true));
let mut mapping = Table::new();
insert_entry(&mut mapping, "milk-man", "Ronny Soak");
insert_entry(&mut mapping, "alter-ego", "Lobsang");
let mapping = mapping;
assert_eq!(invar_defaults_state.props().as_ref(), &mapping);
Ok(())
}
#[test]
fn test_empty_default_invar() -> Result<()> {
let toml = indoc! {r#"
[niche]
name = "example"
"#};
debug!("TOML: [{}]", &toml);
let thundercloud_config = from_str(toml, ConfigFormat::TOML)?;
assert_eq!(thundercloud_config.niche().name(), "example");
assert_eq!(thundercloud_config.niche().description(), None);
let invar_defaults = thundercloud_config.invar_defaults().into_owned();
let invar_defaults_state = invar_defaults.clone_state();
assert_eq!(invar_defaults_state.write_mode_option(), None);
assert_eq!(invar_defaults_state.write_mode(), Overwrite);
assert_eq!(invar_defaults_state.interpolate_option(), None);
assert_eq!(invar_defaults_state.interpolate(), true);
let mapping = Table::new();
assert_eq!(invar_defaults_state.props().as_ref(), &mapping);
Ok(())
}
}