1use anyhow::{Context, Result};
8use std::path::PathBuf;
9
10pub fn config_dir() -> Result<PathBuf> {
20 match std::env::var("XDG_CONFIG_HOME") {
21 Ok(xdg) => Ok(PathBuf::from(xdg).join("tl")),
22 Err(_) => Ok(home_dir()?.join(".config").join("tl")),
23 }
24}
25
26pub fn cache_dir() -> Result<PathBuf> {
36 match std::env::var("XDG_CACHE_HOME") {
37 Ok(xdg) => Ok(PathBuf::from(xdg).join("tl")),
38 Err(_) => Ok(home_dir()?.join(".cache").join("tl")),
39 }
40}
41
42fn home_dir() -> Result<PathBuf> {
48 dirs::home_dir().context("Failed to determine home directory")
49}
50
51#[cfg(test)]
52#[allow(clippy::unwrap_used)]
53mod tests {
54 use super::*;
55 use serial_test::serial;
56
57 #[test]
58 #[serial]
59 fn test_config_dir_default() {
60 let original = std::env::var("XDG_CONFIG_HOME").ok();
62 unsafe { std::env::remove_var("XDG_CONFIG_HOME") };
63
64 let dir = config_dir().unwrap();
65 assert!(dir.ends_with(".config/tl"));
66
67 if let Some(val) = original {
69 unsafe { std::env::set_var("XDG_CONFIG_HOME", val) };
70 }
71 }
72
73 #[test]
74 #[serial]
75 fn test_config_dir_xdg_override() {
76 let original = std::env::var("XDG_CONFIG_HOME").ok();
77 unsafe { std::env::set_var("XDG_CONFIG_HOME", "/custom/config") };
78
79 let dir = config_dir().unwrap();
80 assert_eq!(dir, PathBuf::from("/custom/config/tl"));
81
82 if let Some(val) = original {
84 unsafe { std::env::set_var("XDG_CONFIG_HOME", val) };
85 } else {
86 unsafe { std::env::remove_var("XDG_CONFIG_HOME") };
87 }
88 }
89
90 #[test]
91 #[serial]
92 fn test_cache_dir_default() {
93 let original = std::env::var("XDG_CACHE_HOME").ok();
95 unsafe { std::env::remove_var("XDG_CACHE_HOME") };
96
97 let dir = cache_dir().unwrap();
98 assert!(dir.ends_with(".cache/tl"));
99
100 if let Some(val) = original {
102 unsafe { std::env::set_var("XDG_CACHE_HOME", val) };
103 }
104 }
105
106 #[test]
107 #[serial]
108 fn test_cache_dir_xdg_override() {
109 let original = std::env::var("XDG_CACHE_HOME").ok();
110 unsafe { std::env::set_var("XDG_CACHE_HOME", "/custom/cache") };
111
112 let dir = cache_dir().unwrap();
113 assert_eq!(dir, PathBuf::from("/custom/cache/tl"));
114
115 if let Some(val) = original {
117 unsafe { std::env::set_var("XDG_CACHE_HOME", val) };
118 } else {
119 unsafe { std::env::remove_var("XDG_CACHE_HOME") };
120 }
121 }
122}