use std::path::{Path, PathBuf};
mod root;
pub use root::{
clear_state_dir, clear_writable_state_dir, set_state_dir, set_writable_state_dir, state_dir,
writable_state_dir,
};
pub fn assets_dir() -> Option<PathBuf> {
state_dir().map(|d| d.join("assets"))
}
pub fn data_dir() -> Option<PathBuf> {
state_dir().map(|d| d.join("data"))
}
pub fn saves_dir() -> Option<PathBuf> {
writable_state_dir().map(|d| d.join("saves"))
}
pub fn preview_saves_dir() -> Option<PathBuf> {
writable_state_dir().map(|d| d.join("preview-saves"))
}
pub fn settings_path() -> Option<PathBuf> {
writable_state_dir().map(|d| d.join("settings"))
}
pub fn crashes_dir() -> Option<PathBuf> {
writable_state_dir().map(|d| d.join("crashes"))
}
pub fn worlds_dir() -> Option<PathBuf> {
state_dir().map(|d| d.join("worlds"))
}
pub fn runtime_cache_in(state_dir: &Path) -> PathBuf {
state_dir.join("cache").join("0")
}
pub fn runtime_cache_path() -> Option<PathBuf> {
writable_state_dir().map(|d| runtime_cache_in(&d))
}
pub fn bundled_runtime_cache_path() -> Option<PathBuf> {
state_dir().map(|d| runtime_cache_in(&d))
}
pub fn build_cache_path() -> Option<PathBuf> {
state_dir().map(|d| d.join("cache").join("1"))
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn installed_roots_redirect_every_state_dir() {
let flat = Path::new("/tmp/flat-probe");
set_state_dir(flat);
assert_eq!(state_dir().as_deref(), Some(flat));
assert_eq!(data_dir().unwrap(), flat.join("data"));
assert_eq!(runtime_cache_path().unwrap(), flat.join("cache").join("0"));
assert_eq!(build_cache_path().unwrap(), flat.join("cache").join("1"));
assert_eq!(assets_dir().unwrap(), flat.join("assets"));
assert_eq!(worlds_dir().unwrap(), flat.join("worlds"));
assert_eq!(writable_state_dir().as_deref(), Some(flat));
assert_eq!(saves_dir().unwrap(), flat.join("saves"));
assert_eq!(settings_path().unwrap(), flat.join("settings"));
assert_eq!(crashes_dir().unwrap(), flat.join("crashes"));
let writable = Path::new("/tmp/per-user-probe");
set_writable_state_dir(writable);
assert_eq!(writable_state_dir().as_deref(), Some(writable));
assert_eq!(saves_dir().unwrap(), writable.join("saves"));
assert_eq!(settings_path().unwrap(), writable.join("settings"));
assert_eq!(crashes_dir().unwrap(), writable.join("crashes"));
assert_eq!(
runtime_cache_path().unwrap(),
writable.join("cache").join("0")
);
assert_eq!(build_cache_path().unwrap(), flat.join("cache").join("1"));
assert_eq!(
bundled_runtime_cache_path().unwrap(),
flat.join("cache").join("0")
);
assert_eq!(data_dir().unwrap(), flat.join("data"));
clear_writable_state_dir();
assert_eq!(saves_dir().unwrap(), flat.join("saves"));
clear_state_dir();
assert_eq!(state_dir(), None);
for path in [
data_dir(),
assets_dir(),
worlds_dir(),
saves_dir(),
preview_saves_dir(),
settings_path(),
crashes_dir(),
runtime_cache_path(),
bundled_runtime_cache_path(),
build_cache_path(),
writable_state_dir(),
] {
assert_eq!(path, None);
}
}
}