use crate::errors::AtomicResult;
use serde::{Deserialize, Serialize};
use std::path::{Path, PathBuf};
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct Config {
pub server: String,
pub agent: String,
pub private_key: String,
}
pub fn default_config_dir_path() -> AtomicResult<PathBuf> {
if let Some(dirs) = directories::UserDirs::new() {
let atomic_config_dir = dirs.home_dir().join(".config/atomic");
return Ok(atomic_config_dir);
}
Err("No default config dir can be found, as no Home directory can be found on this operating system".into())
}
pub fn default_config_file_path() -> AtomicResult<PathBuf> {
let mut default_dir = default_config_dir_path()?;
default_dir.push("config.toml");
Ok(default_dir)
}
pub fn read_config(path: Option<&Path>) -> AtomicResult<Config> {
let default = default_config_file_path()?;
let path = path.unwrap_or(&default);
let config_string = std::fs::read_to_string(path)
.map_err(|e| format!("Error reading config from {:?}. {}", path, e))?;
let config: Config = toml::from_str(&config_string)
.map_err(|e| format!("Could not parse toml in config file {:?}. {}", path, e))?;
Ok(config)
}
pub fn write_config(path: &Path, config: Config) -> AtomicResult<String> {
let out =
toml::to_string_pretty(&config).map_err(|e| format!("Error serializing config. {}", e))?;
let prefix = path
.parent()
.ok_or("Could not get parent dir of config file")?;
std::fs::create_dir_all(prefix)
.map_err(|e| format!("Could not create config directory {:?} . {}", prefix, e))?;
std::fs::write(path, out.clone())
.map_err(|e| format!("Error writing config file to {:?}. {}", path, e))?;
Ok(out)
}