//! Where Onset keeps things on this machine, and its environment variables. use std::ffi::OsString; use std::path::PathBuf; /// `ONSET_`, or `VCS_` as it was called before Onset had its name (empty counts as unset). pub fn var_os(name: &str) -> Option { let set = |v: String| std::env::var_os(v).filter(|v| !v.is_empty()); set(format!("ONSET_{name}")).or_else(|| set(format!("VCS_{name}"))) } /// [`var_os`] as text. pub fn var(name: &str) -> Option { var_os(name).and_then(|v| v.into_string().ok()) } /// ONSET_HOME, else the platform's data folder (~/.local/share/onset on /// Linux, ~/Library/Application Support/onset on macOS, %LOCALAPPDATA%\onset /// on Windows). A machine that used it as vcs keeps its folder of that name. pub fn home() -> PathBuf { if let Some(dir) = var_os("HOME") { return PathBuf::from(dir); } let data = if cfg!(windows) && let Some(local) = std::env::var_os("LOCALAPPDATA").filter(|d| !d.is_empty()) { PathBuf::from(local) } else { let user = crate::sys::user_home().unwrap_or_else(|| ".".into()); if cfg!(target_os = "macos") { user.join("Library/Application Support") } else { match std::env::var_os("XDG_DATA_HOME") { Some(d) if !d.is_empty() => PathBuf::from(d), _ => user.join(".local/share"), } } }; let (new, old) = (data.join("onset"), data.join("vcs")); if !new.exists() && old.join("vcs.db").exists() { old } else { new } } pub fn objects() -> PathBuf { home().join("objects") } /// Sign-in tokens, readable only by the user. pub fn credentials() -> PathBuf { home().join("credentials.json") }