use crate::config::configurable::SupervisorConfig;
use crate::config::state::ConfigState;
use crate::error::types::SupervisorError;
use std::fs;
use std::path::Path;
pub fn load_config_state(path: impl AsRef<Path>) -> Result<ConfigState, SupervisorError> {
ensure_yaml_format(path.as_ref())?;
let contents = fs::read_to_string(path.as_ref()).map_err(|error| {
SupervisorError::fatal_config(format!("failed to read config file: {error}"))
})?;
let config: SupervisorConfig = serde_yaml::from_str(&contents).map_err(|error| {
SupervisorError::fatal_config(format!("failed to parse YAML config: {error}"))
})?;
ConfigState::try_from(config)
}
fn ensure_yaml_format(path: &Path) -> Result<(), SupervisorError> {
let format = rust_config_tree::ConfigFormat::from_path(path);
if format == rust_config_tree::ConfigFormat::Yaml {
Ok(())
} else {
Err(SupervisorError::fatal_config(
"supervisor configuration must use YAML",
))
}
}