use saphyr::{LoadableYamlNode, ScanError, Yaml};
use std::fs;
use std::path::PathBuf;
use crate::modules;
fn parse_configuration(raw_config: &PathBuf) -> Result<Yaml<'_>, ScanError> {
let config_string =
fs::read_to_string(raw_config).expect("failed to read file: ");
let config = Yaml::load_from_str(&config_string);
match config {
Ok(node) => Ok(Yaml::Sequence(node)),
Err(error) => Err(error),
}
}
pub fn apply_configuration(raw_config: &PathBuf) -> Result<(), String> {
let config_check = parse_configuration(&raw_config);
if config_check.is_err() {
let error = config_check.unwrap_err();
let error_message =
format!("failed to parse YAML: {}", error.to_string());
return Err(error_message);
}
let config_wrapped = config_check.unwrap();
let config = &config_wrapped[0];
if !config.is_mapping() {
let error_message = format!("supposed YAML config is not a mapping");
return Err(error_message);
}
for (key, value) in config.as_mapping().unwrap() {
let key_string = key.as_str().unwrap();
let application_result = match key_string {
"hyprland" => modules::hyprland::apply_config(&value),
"hyprpaper" => modules::hyprpaper::apply_config(&value),
_ => return Err(format!("{}: {}", "invalid command", key_string)),
};
if application_result.is_err() {
return application_result;
}
}
Ok(())
}