Skip to main content

maolan_engine/plugins/
paths.rs

1use std::path::PathBuf;
2
3pub fn home_dir() -> String {
4    std::env::var("HOME")
5        .or_else(|_| std::env::var("USERPROFILE"))
6        .unwrap_or_default()
7}
8
9pub fn push_macos_audio_plugin_roots(roots: &mut Vec<PathBuf>, plugin_dir_name: &str) {
10    roots.push(PathBuf::from(format!(
11        "/Library/Audio/Plug-Ins/{plugin_dir_name}"
12    )));
13    roots.push(PathBuf::from(format!(
14        "{}/Library/Audio/Plug-Ins/{plugin_dir_name}",
15        home_dir()
16    )));
17}
18
19pub fn push_unix_plugin_roots(roots: &mut Vec<PathBuf>, plugin_dir_name: &str) {
20    roots.push(PathBuf::from(format!("/usr/lib/{plugin_dir_name}")));
21    roots.push(PathBuf::from(format!("/usr/lib64/{plugin_dir_name}")));
22    roots.push(PathBuf::from(format!("/usr/local/lib/{plugin_dir_name}")));
23    roots.push(PathBuf::from(format!("/usr/local/lib64/{plugin_dir_name}")));
24    roots.push(PathBuf::from(format!("{}/.{plugin_dir_name}", home_dir())));
25    roots.push(PathBuf::from(format!(
26        "{}/.local/lib/{plugin_dir_name}",
27        home_dir()
28    )));
29}
30
31#[cfg(test)]
32mod tests {
33    use super::*;
34    use std::sync::{LazyLock, Mutex};
35
36    static ENV_GUARD: LazyLock<Mutex<()>> = LazyLock::new(|| Mutex::new(()));
37
38    #[test]
39    fn home_dir_prefers_home_over_userprofile() {
40        let _guard = ENV_GUARD.lock().expect("lock env guard");
41        let old_home = std::env::var("HOME").ok();
42        let old_userprofile = std::env::var("USERPROFILE").ok();
43
44        unsafe {
45            std::env::set_var("HOME", "/home/tester");
46            std::env::set_var("USERPROFILE", "C:/Users/tester");
47        }
48
49        let home = home_dir();
50
51        if let Some(value) = old_home {
52            unsafe { std::env::set_var("HOME", value) };
53        } else {
54            unsafe { std::env::remove_var("HOME") };
55        }
56        if let Some(value) = old_userprofile {
57            unsafe { std::env::set_var("USERPROFILE", value) };
58        } else {
59            unsafe { std::env::remove_var("USERPROFILE") };
60        }
61
62        assert_eq!(home, "/home/tester");
63    }
64
65    #[test]
66    fn push_unix_plugin_roots_adds_system_and_user_locations() {
67        let _guard = ENV_GUARD.lock().expect("lock env guard");
68        let old_home = std::env::var("HOME").ok();
69        unsafe {
70            std::env::set_var("HOME", "/home/tester");
71        }
72
73        let mut roots = Vec::new();
74        push_unix_plugin_roots(&mut roots, "clap");
75
76        if let Some(value) = old_home {
77            unsafe { std::env::set_var("HOME", value) };
78        } else {
79            unsafe { std::env::remove_var("HOME") };
80        }
81
82        assert_eq!(
83            roots,
84            vec![
85                PathBuf::from("/usr/lib/clap"),
86                PathBuf::from("/usr/lib64/clap"),
87                PathBuf::from("/usr/local/lib/clap"),
88                PathBuf::from("/usr/local/lib64/clap"),
89                PathBuf::from("/home/tester/.clap"),
90                PathBuf::from("/home/tester/.local/lib/clap"),
91            ]
92        );
93    }
94}