Skip to main content

sac/
paths.rs

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}