use anyhow::Result; use serde::{Deserialize, Serialize}; use std::path::PathBuf; /// Simple local config: ~/.config/notdouble/config.toml #[derive(Debug, Default, Serialize, Deserialize)] pub struct Config { #[serde(skip_serializing_if = "Option::is_none")] pub server: Option, #[serde(skip_serializing_if = "Option::is_none")] pub token: Option, } /// HOME, USERPROFILE fallback sane across platforms. pub fn home_dir() -> Result { for k in ["HOME", "USERPROFILE"] { if let Ok(h) = std::env::var(k) { if !h.trim().is_empty() { return Ok(PathBuf::from(h)); } } } Err(anyhow::anyhow!( "cannot determine home dir (set HOME or USERPROFILE)" )) } pub fn config_path() -> Result { Ok(home_dir()?.join(".config/notdouble/config.toml")) } /// The local keypair that signs uploads/deletes (ownership identity). pub fn identity_path() -> Result { let p = config_path()?; Ok(p.parent() .map(|d| d.join("identity.key")) .unwrap_or_else(|| PathBuf::from("identity.key"))) } pub fn load() -> Config { config_path() .ok() .and_then(|p| std::fs::read_to_string(p).ok()) .and_then(|s| toml::from_str(&s).ok()) .unwrap_or_default() }