use std::path::Path;
use crate::config::read_config_file::{config_path, parse_config_str, ConfigEnv, SystemConfigEnv};
use crate::config::CardanoWallConfig;
use crate::util::CliError;
pub fn load_config_for_edit(env: &dyn ConfigEnv) -> Result<CardanoWallConfig, CliError> {
let path = config_path(env)?;
match env.read_to_string(&path) {
Ok(raw) => parse_config_str(&raw, &path, env),
Err(None) => Ok(CardanoWallConfig::default()),
Err(Some(e)) => Err(CliError::input(format!(
"config: cannot read {}: {e}",
path.display()
))),
}
}
pub fn write_config(env: &dyn ConfigEnv, config: &CardanoWallConfig) -> Result<(), CliError> {
let path = config_path(env)?;
let serialised = toml::to_string_pretty(config)
.map_err(|e| CliError::input(format!("config: cannot serialise config.toml: {e}")))?;
if let Some(dir) = path.parent() {
std::fs::create_dir_all(dir).map_err(|e| {
CliError::input(format!(
"config: cannot create config dir {}: {e}",
dir.display()
))
})?;
}
let tmp = path.with_extension("toml.tmp");
std::fs::write(&tmp, serialised).map_err(|e| {
CliError::input(format!(
"config: cannot write config tmp at {}: {e}",
tmp.display()
))
})?;
set_owner_only(&tmp);
std::fs::rename(&tmp, &path).map_err(|e| {
CliError::input(format!(
"config: cannot finalise config at {}: {e}",
path.display()
))
})?;
set_owner_only(&path);
Ok(())
}
pub fn system_config_path() -> Result<std::path::PathBuf, CliError> {
config_path(&SystemConfigEnv)
}
#[cfg(unix)]
fn set_owner_only(path: &Path) {
use std::os::unix::fs::PermissionsExt;
let _ = std::fs::set_permissions(path, std::fs::Permissions::from_mode(0o600));
}
#[cfg(not(unix))]
fn set_owner_only(_path: &Path) {}