use crate::{Error, Settings}; use config::{Config, File};
use directories::ProjectDirs;
use std::path::PathBuf;
use toml;
const CONFIG_FILE_NAME: &str = "config.toml";
pub fn get_project_dirs() -> Result<ProjectDirs, Error> {
ProjectDirs::from("com", "YourOrg", "crbrs") .ok_or(Error::DirectoryResolutionFailed)
}
pub fn get_compiler_storage_path(settings: &Settings) -> Result<PathBuf, Error> {
match &settings.compiler_storage_path {
Some(path) => Ok(path.clone()),
None => {
let proj_dirs = get_project_dirs()?;
Ok(proj_dirs.data_local_dir().join("compilers"))
}
}
}
pub fn get_config_file_path() -> Result<PathBuf, Error> {
let proj_dirs = get_project_dirs()?;
let config_dir = proj_dirs.config_dir();
Ok(config_dir.join(CONFIG_FILE_NAME))
}
pub fn load_settings() -> Result<Settings, Error> {
let config_file_path = get_config_file_path()?;
let config_dir = config_file_path.parent().ok_or_else(|| Error::Io(
std::io::Error::new(std::io::ErrorKind::NotFound, "Config directory not found") ))?;
log::debug!("Attempting to load configuration from: {:?}", config_file_path);
let settings = Config::builder()
.add_source(Config::try_from(&Settings::default())?)
.add_source(File::from(config_file_path.clone()).required(false))
.build()?;
log::debug!("Configuration loaded successfully.");
settings.try_deserialize::<Settings>().map_err(Error::Config)
}
pub fn save_settings(settings: &Settings) -> Result<(), Error> {
let config_file_path = get_config_file_path()?;
let config_dir = config_file_path.parent().ok_or_else(|| Error::Io(
std::io::Error::new(std::io::ErrorKind::NotFound, "Config directory not found")
))?;
std::fs::create_dir_all(config_dir)?;
let toml_content = toml::to_string_pretty(settings)
.map_err(|e| Error::Config(config::ConfigError::Foreign(Box::new(e))))?;
std::fs::write(&config_file_path, toml_content)?;
log::info!("Configuration saved to: {:?}", config_file_path);
Ok(())
}