Skip to main content

maolan_engine/plugins/
mod.rs

1pub mod clap_proc;
2pub mod ipc;
3#[cfg(all(unix, not(target_os = "macos")))]
4pub mod lv2_proc;
5pub mod types;
6pub mod vst3_proc;
7
8pub use types::*;
9
10use serde::de::DeserializeOwned;
11
12pub fn scan_plugins<T: DeserializeOwned>(format: &str) -> Result<Vec<T>, String> {
13    let host_bin = ipc::find_plugin_host_binary().ok_or("maolan-plugin-host binary not found")?;
14
15    let mut cmd = std::process::Command::new(&host_bin);
16    cmd.arg("--scan")
17        .arg("--format")
18        .arg(format)
19        .arg("--path")
20        .arg("--system");
21    ipc::append_parent_log_level(&mut cmd);
22
23    let output = cmd
24        .output()
25        .map_err(|e| format!("failed to spawn plugin-host scanner: {e}"))?;
26
27    if !output.status.success() {
28        let stderr = String::from_utf8_lossy(&output.stderr);
29        return Err(format!(
30            "plugin-host scanner exited with code {:?}: {stderr}",
31            output.status.code()
32        ));
33    }
34
35    let json = String::from_utf8_lossy(&output.stdout);
36    serde_json::from_str(&json).map_err(|e| format!("failed to parse scan JSON: {e}"))
37}