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
31pub fn push_windows_vst3_roots(roots: &mut Vec<PathBuf>) {
32    roots.push(PathBuf::from(r"C:\Program Files\Common Files\VST3"));
33    roots.push(PathBuf::from(r"C:\Program Files (x86)\Common Files\VST3"));
34}
35
36#[cfg(test)]
37mod tests {
38    use super::*;
39    use std::sync::{LazyLock, Mutex};
40
41    static ENV_GUARD: LazyLock<Mutex<()>> = LazyLock::new(|| Mutex::new(()));
42
43    #[test]
44    fn home_dir_prefers_home_over_userprofile() {
45        let _guard = ENV_GUARD.lock().expect("lock env guard");
46        let old_home = std::env::var("HOME").ok();
47        let old_userprofile = std::env::var("USERPROFILE").ok();
48
49        unsafe {
50            std::env::set_var("HOME", "/home/tester");
51            std::env::set_var("USERPROFILE", "C:/Users/tester");
52        }
53
54        let home = home_dir();
55
56        if let Some(value) = old_home {
57            unsafe { std::env::set_var("HOME", value) };
58        } else {
59            unsafe { std::env::remove_var("HOME") };
60        }
61        if let Some(value) = old_userprofile {
62            unsafe { std::env::set_var("USERPROFILE", value) };
63        } else {
64            unsafe { std::env::remove_var("USERPROFILE") };
65        }
66
67        assert_eq!(home, "/home/tester");
68    }
69
70    #[test]
71    fn push_unix_plugin_roots_adds_system_and_user_locations() {
72        let _guard = ENV_GUARD.lock().expect("lock env guard");
73        let old_home = std::env::var("HOME").ok();
74        unsafe {
75            std::env::set_var("HOME", "/home/tester");
76        }
77
78        let mut roots = Vec::new();
79        push_unix_plugin_roots(&mut roots, "clap");
80
81        if let Some(value) = old_home {
82            unsafe { std::env::set_var("HOME", value) };
83        } else {
84            unsafe { std::env::remove_var("HOME") };
85        }
86
87        assert_eq!(
88            roots,
89            vec![
90                PathBuf::from("/usr/lib/clap"),
91                PathBuf::from("/usr/lib64/clap"),
92                PathBuf::from("/usr/local/lib/clap"),
93                PathBuf::from("/usr/local/lib64/clap"),
94                PathBuf::from("/home/tester/.clap"),
95                PathBuf::from("/home/tester/.local/lib/clap"),
96            ]
97        );
98    }
99
100    #[test]
101    fn push_windows_vst3_roots_adds_standard_locations() {
102        let mut roots = Vec::new();
103
104        push_windows_vst3_roots(&mut roots);
105
106        assert_eq!(
107            roots,
108            vec![
109                PathBuf::from(r"C:\Program Files\Common Files\VST3"),
110                PathBuf::from(r"C:\Program Files (x86)\Common Files\VST3"),
111            ]
112        );
113    }
114}