use std::path::PathBuf;
use serde::{Deserialize, Serialize};
use crate::model::{Exposure, Starter};
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
pub struct GlobalConfig {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub default_port: Option<u16>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub default_expose: Option<Exposure>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub autoserve: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub idle_timeout_secs: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub autostart: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub starter: Option<Starter>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub skill_target: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub skill_global: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub ui_accent: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub ui_theme: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub default_identity: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub prefer_default_identity: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub scan_roots: Option<Vec<String>>,
}
impl GlobalConfig {
pub fn path() -> Option<PathBuf> {
if let Ok(dir) = std::env::var("WIPE_CONFIG_DIR") {
if !dir.trim().is_empty() {
return Some(PathBuf::from(dir).join("config.json"));
}
}
directories::ProjectDirs::from("dev", "wipe", "wipe")
.map(|d| d.config_dir().join("config.json"))
}
pub fn load() -> Self {
Self::path()
.and_then(|p| std::fs::read(p).ok())
.and_then(|b| serde_json::from_slice(&b).ok())
.unwrap_or_default()
}
pub fn save(&self) -> std::io::Result<()> {
if let Some(path) = Self::path() {
if let Some(dir) = path.parent() {
std::fs::create_dir_all(dir)?;
}
let mut s = serde_json::to_string_pretty(self).unwrap_or_default();
s.push('\n');
let tmp = path.with_extension("json.tmp");
std::fs::write(&tmp, s)?;
std::fs::rename(&tmp, &path)?;
}
Ok(())
}
}