use crate::os::env::Env;
use std::path::PathBuf;
use crate::config_files::home;
#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
pub enum MacOSBehaviour {
UseLibrary,
LinuxFallback,
}
fn config_fallback(env: &Env, behaviour: MacOSBehaviour) -> Option<PathBuf> {
if cfg!(windows) {
home()
.map(|mut home| {
home.push("AppData");
home.push("Local");
home
})
.or_else(|| env.get("LOCALAPPDATA").ok().map(PathBuf::from))
} else if cfg!(target_os = "macos") && matches!(behaviour, MacOSBehaviour::UseLibrary) {
home().map(|mut home| {
home.push("Library");
home.push("Application Support");
home
})
} else {
home().map(|mut home| {
home.push(".config");
home
})
}
}
fn cache_fallback(env: &Env, behaviour: MacOSBehaviour) -> Option<PathBuf> {
if cfg!(windows) {
home()
.map(|mut home| {
home.push("AppData");
home.push("Local");
home
})
.or_else(|| {
env.get("LOCALAPPDATA").ok().map(|localappdata| {
let mut buf = PathBuf::from(localappdata);
buf.push("caches");
buf
})
})
} else if cfg!(target_os = "macos") && matches!(behaviour, MacOSBehaviour::UseLibrary) {
home().map(|mut home| {
home.push("Library");
home.push("Caches");
home
})
} else {
home().map(|mut home| {
home.push(".cache");
home
})
}
}
fn data_fallback(env: &Env, behaviour: MacOSBehaviour) -> Option<PathBuf> {
if cfg!(windows) {
home()
.map(|mut home| {
home.push("AppData");
home.push("Local");
home
})
.or_else(|| env.get("LOCALAPPDATA").ok().map(PathBuf::from))
} else if cfg!(target_os = "macos") && matches!(behaviour, MacOSBehaviour::UseLibrary) {
home().map(|mut home| {
home.push("Library");
home.push("Application Support");
home
})
} else {
home().map(|mut home| {
home.push(".local");
home.push("share");
home
})
}
}
fn state_fallback(env: &Env, behaviour: MacOSBehaviour) -> Option<PathBuf> {
if cfg!(windows) {
home()
.map(|mut home| {
home.push("AppData");
home.push("Local");
home
})
.or_else(|| env.get("LOCALAPPDATA").ok().map(PathBuf::from))
} else if cfg!(target_os = "macos") && matches!(behaviour, MacOSBehaviour::UseLibrary) {
home().map(|mut home| {
home.push("Library");
home.push("Application Support");
home
})
} else {
home().map(|mut home| {
home.push(".local");
home.push("state");
home
})
}
}
pub fn config(env: &Env, behaviour: MacOSBehaviour) -> Option<PathBuf> {
env.get("XDG_CONFIG_HOME")
.ok()
.map(PathBuf::from)
.or_else(|| config_fallback(env, behaviour))
}
pub fn data(env: &Env, behaviour: MacOSBehaviour) -> Option<PathBuf> {
env.get("XDG_DATA_HOME")
.ok()
.map(PathBuf::from)
.or_else(|| data_fallback(env, behaviour))
}
pub fn cache(env: &Env, behaviour: MacOSBehaviour) -> Option<PathBuf> {
env.get("XDG_CACHE_HOME")
.ok()
.map(PathBuf::from)
.or_else(|| cache_fallback(env, behaviour))
}
pub fn state(env: &Env, behaviour: MacOSBehaviour) -> Option<PathBuf> {
env.get("XDG_STATE_HOME")
.ok()
.map(PathBuf::from)
.or_else(|| state_fallback(env, behaviour))
}