use std::{env, path::PathBuf}; use crate::xdg; const APPDATA: &str = "APPDATA"; const LOCALAPPDATA: &str = "LOCALAPPDATA"; const USERPROFILE: &str = "USERPROFILE"; pub fn bin_home() -> Option { resolve_path(LOCALAPPDATA).map(|p| p.join("Programs")) } pub fn cache_home() -> Option { resolve_xdg_path_with_fallback(xdg::CACHE_HOME, LOCALAPPDATA) } pub fn config_home() -> Option { resolve_xdg_path_with_fallback(xdg::CONFIG_HOME, APPDATA) } pub fn config_local() -> Option { resolve_path(LOCALAPPDATA) } pub fn data_home() -> Option { resolve_xdg_path_with_fallback(xdg::DATA_HOME, APPDATA) } pub fn data_local() -> Option { env::var_os(LOCALAPPDATA).map(PathBuf::from) } pub fn desktop() -> Option { resolve_xdg_path_with_fallback_and_sub_dir(xdg::DESKTOP_DIR, USERPROFILE, "Desktop") } pub fn documents() -> Option { resolve_xdg_path_with_fallback_and_sub_dir(xdg::DOCUMENTS_DIR, USERPROFILE, "Documents") } pub fn downloads() -> Option { resolve_xdg_path_with_fallback_and_sub_dir(xdg::DOWNLOAD_DIR, USERPROFILE, "Downloads") } pub fn fonts() -> Option { None } pub fn music() -> Option { resolve_xdg_path_with_fallback_and_sub_dir(xdg::MUSIC_DIR, USERPROFILE, "Music") } pub fn pictures() -> Option { resolve_xdg_path_with_fallback_and_sub_dir(xdg::PICTURES_DIR, USERPROFILE, "Pictures") } pub fn preferences() -> Option { config_home() } pub fn publicshare() -> Option { Some(PathBuf::from("C:\\Users\\Public")) } pub fn runtime() -> Option { env::var_os("TEMP").map(PathBuf::from) } pub fn state_home() -> Option { resolve_xdg_path_with_fallback(xdg::STATE_HOME, LOCALAPPDATA) } pub fn templates() -> Option { resolve_xdg_path_with_fallback_and_sub_dir(xdg::TEMPLATES_DIR, USERPROFILE, "Templates") } pub fn videos() -> Option { resolve_xdg_path_with_fallback_and_sub_dir(xdg::VIDEOS_DIR, USERPROFILE, "Videos") } fn resolve_path(key: &str) -> Option { env::var_os(key).map(PathBuf::from) } fn resolve_xdg_path_with_fallback(xdg_key: &str, key: &str) -> Option { xdg::resolve_path(xdg_key).or_else(|| env::var_os(key).map(PathBuf::from)) } fn resolve_xdg_path_with_fallback_and_sub_dir(xdg_key: &str, key: &str, sub_dir: &str) -> Option { resolve_xdg_path_with_fallback(xdg_key, key).map(|p| p.join(sub_dir)) }