maolan_engine/plugins/
paths.rs1use 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}