From 7cb3e5fbf183c24a91c75c9afed85127ebf5123c Mon Sep 17 00:00:00 2001 From: Jonas Maier Date: Thu, 14 May 2026 15:21:01 +0200 Subject: correct handling of XDG dirs --- src/basedir.rs | 51 +++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 39 insertions(+), 12 deletions(-) (limited to 'src/basedir.rs') diff --git a/src/basedir.rs b/src/basedir.rs index e5bcff7..d2ede87 100644 --- a/src/basedir.rs +++ b/src/basedir.rs @@ -10,22 +10,49 @@ pub fn home() -> PathBuf { } } -fn alt_dir() -> PathBuf { - PathBuf::from(format!("{}/.{}", home().to_string_lossy(), NAME)) +/// Choosing directories according to https://specifications.freedesktop.org/basedir/latest/#variables +pub mod xdg { + use super::*; + + /// $XDG_DATA_HOME defines the base directory relative to which user-specific data files should be stored. + /// If $XDG_DATA_HOME is either not set or empty, a default equal to $HOME/.local/share should be used. + pub fn data_home() -> PathBuf { + if let Some(dir) = env::var_os("XDG_DATA_HOME") { + PathBuf::from(dir) + } else { + home().join(".local/share") + } + } + + /// $XDG_CONFIG_HOME defines the base directory relative to which user-specific configuration files should be stored. + /// If $XDG_CONFIG_HOME is either not set or empty, a default equal to $HOME/.config should be used. + pub fn config_home() -> PathBuf { + if let Some(dir) = env::var_os("XDG_CONFIG_HOME") { + PathBuf::from(dir) + } else { + home().join(".config") + } + } + + /// $XDG_STATE_HOME defines the base directory relative to which user-specific state files should be stored. + /// If $XDG_STATE_HOME is either not set or empty, a default equal to $HOME/.local/state should be used. + pub fn state_home() -> PathBuf { + if let Some(dir) = env::var_os("XDG_STATE_HOME") { + PathBuf::from(dir) + } else { + home().join(".local/state") + } + } } pub fn data_dir() -> PathBuf { - if let Ok(base) = env::var("XDG_DATA_HOME") { - PathBuf::from(base).join(NAME) - } else { - alt_dir() - } + xdg::data_home().join(NAME) } pub fn config_dir() -> PathBuf { - if let Ok(base) = env::var("XDG_CONFIG_HOME") { - PathBuf::from(base).join(NAME) - } else { - alt_dir() - } + xdg::config_home().join(NAME) +} + +pub fn state_dir() -> PathBuf { + xdg::state_home().join(NAME) } -- cgit v1.2.3