use std::path::Path;
use std::sync::Arc;
use tropel_ext::registry::ExtensionRegistry;
use tropel_sdk::{Result, TropelError};
pub(crate) fn build_registry(
subprocess_adapter: &[String],
plugins_dir: Option<&Path>,
) -> Result<ExtensionRegistry> {
let mut registry = ExtensionRegistry::new();
for cmd in subprocess_adapter {
if cmd.trim().is_empty() {
return Err(TropelError::Other(format!(
"--subprocess-adapter requires a non-empty command (got {cmd:?})"
)));
}
let id = format!("subprocess:{}", cmd);
tracing::info!("Registering subprocess adapter (command: {})", cmd);
let cmd_clone = cmd.clone();
registry.register_adapter_factory(
&id,
Arc::new(move || {
Box::new(
tropel_input_subprocess::SubprocessAdapter::new(&cmd_clone)
.expect("command validated non-empty above"),
)
}),
);
}
if let Some(dir) = plugins_dir {
let adapters = tropel_wasm::discover_plugins(dir);
tracing::info!(
"Loaded {} WASM plugin(s) from {}",
adapters.len(),
dir.display()
);
for adapter in adapters {
let id = format!("wasm:{}", adapter.plugin_id());
let adapter = adapter.clone();
registry.register_adapter_factory(&id, Arc::new(move || Box::new(adapter.clone())));
}
}
Ok(registry)
}