use serde::{Deserialize, Serialize};
use super::settings::AuditSettings;
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct GlobalConfig {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub editor: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub keyfile_path: Option<String>,
#[serde(default)]
pub audit: AuditSettings,
}
impl GlobalConfig {
pub fn load() -> Self {
let Some(path) = Self::config_path() else {
return Self::default();
};
let Ok(contents) = std::fs::read_to_string(&path) else {
return Self::default();
};
toml::from_str(&contents).unwrap_or_default()
}
fn config_path() -> Option<std::path::PathBuf> {
let home = std::env::var("HOME")
.or_else(|_| std::env::var("USERPROFILE"))
.ok()?;
Some(
std::path::PathBuf::from(home)
.join(".config")
.join("envvault")
.join("config.toml"),
)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn global_config_returns_defaults_when_file_missing() {
let config = GlobalConfig::load();
assert!(config.editor.is_none());
assert!(config.keyfile_path.is_none());
assert!(!config.audit.log_reads);
}
}