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
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}