1use std::env;
2use std::path::PathBuf;
3
4pub fn sac_home_dir() -> Option<PathBuf> {
5 if let Some(sac_home) = env::var_os("SAC_HOME") {
6 return Some(PathBuf::from(sac_home));
7 }
8
9 if let Some(xdg_config_home) = env::var_os("XDG_CONFIG_HOME") {
10 return Some(PathBuf::from(xdg_config_home).join("sac"));
11 }
12
13 env::var_os("HOME")
14 .map(PathBuf::from)
15 .map(|home| home.join(".config").join("sac"))
16}
17
18pub fn sac_config_path() -> Option<PathBuf> {
19 sac_home_dir().map(|dir| dir.join("config.toml"))
20}
21
22pub fn sac_logs_dir() -> Option<PathBuf> {
23 sac_home_dir().map(|dir| dir.join("logs"))
24}
25
26pub fn sac_log_path_for_pid(pid: u32) -> Option<PathBuf> {
27 sac_logs_dir().map(|dir| dir.join(format!("sac-{}.log", pid)))
28}
29
30#[cfg(test)]
31mod tests {
32 use super::*;
33 use crate::test_env_lock;
34 use std::ffi::OsString;
35
36 fn restore_env(name: &str, value: Option<OsString>) {
37 match value {
38 Some(value) => unsafe { std::env::set_var(name, value) },
39 None => unsafe { std::env::remove_var(name) },
40 }
41 }
42
43 #[test]
44 fn log_path_uses_sac_home_layout() {
45 let _guard = test_env_lock();
46 let original_sac_home = std::env::var_os("SAC_HOME");
47 let root = std::env::temp_dir().join(format!(
48 "sac_logs_path_{}",
49 std::time::SystemTime::now()
50 .duration_since(std::time::UNIX_EPOCH)
51 .expect("time went backwards")
52 .as_nanos()
53 ));
54
55 unsafe {
56 std::env::set_var("SAC_HOME", &root);
57 }
58
59 let path = sac_log_path_for_pid(4242).unwrap();
60 assert_eq!(path, root.join("logs").join("sac-4242.log"));
61
62 restore_env("SAC_HOME", original_sac_home);
63 }
64}