1use std::path::PathBuf;
11use std::sync::{LazyLock, RwLock};
12
13static CACHE_DIR_OVERRIDE: LazyLock<RwLock<Option<PathBuf>>> = LazyLock::new(|| RwLock::new(None));
14static CONFIG_DIR_OVERRIDE: LazyLock<RwLock<Option<PathBuf>>> = LazyLock::new(|| RwLock::new(None));
15
16pub fn set_cache_dir_override(path: Option<PathBuf>) {
18 *CACHE_DIR_OVERRIDE.write().expect("cache override lock") = path;
19}
20
21pub fn set_config_dir_override(path: Option<PathBuf>) {
23 *CONFIG_DIR_OVERRIDE.write().expect("config override lock") = path;
24}
25
26pub fn cache_dir() -> PathBuf {
27 if let Some(p) = CACHE_DIR_OVERRIDE
28 .read()
29 .expect("cache override lock")
30 .clone()
31 {
32 return p;
33 }
34 if let Ok(p) = std::env::var("SKIFF_CACHE_DIR") {
35 return PathBuf::from(p);
36 }
37 home_dir()
38 .map(|h| h.join(".cache").join("skiff"))
39 .unwrap_or_else(|| PathBuf::from(".cache/skiff"))
40}
41
42pub fn config_dir() -> PathBuf {
43 if let Some(p) = CONFIG_DIR_OVERRIDE
44 .read()
45 .expect("config override lock")
46 .clone()
47 {
48 return p;
49 }
50 if let Ok(p) = std::env::var("SKIFF_CONFIG_DIR") {
51 return PathBuf::from(p);
52 }
53 home_dir()
54 .map(|h| h.join(".config").join("skiff"))
55 .unwrap_or_else(|| PathBuf::from(".config/skiff"))
56}
57
58pub fn usage_file() -> PathBuf {
59 cache_dir().join("usage.json")
60}
61
62pub fn baked_file() -> PathBuf {
63 config_dir().join("baked.json")
64}
65
66fn home_dir() -> Option<PathBuf> {
67 std::env::var_os("HOME")
68 .or_else(|| std::env::var_os("USERPROFILE"))
69 .map(PathBuf::from)
70}
71
72pub const DEFAULT_CACHE_TTL: u64 = 3600;
73
74#[cfg(test)]
76pub static TEST_PATHS_LOCK: std::sync::Mutex<()> = std::sync::Mutex::new(());