use serde_json::Value;
use synaptic_core::SynapticError;
use crate::ToolRegistry;
pub struct ParallelToolExecutor {
registry: ToolRegistry,
}
impl ParallelToolExecutor {
pub fn new(registry: ToolRegistry) -> Self {
Self { registry }
}
pub async fn execute_all(
&self,
calls: Vec<(String, Value)>,
) -> Vec<Result<Value, SynapticError>> {
let futures: Vec<_> = calls
.into_iter()
.map(|(name, args)| {
let registry = self.registry.clone();
async move {
let tool = registry
.get(&name)
.ok_or(SynapticError::ToolNotFound(name))?;
tool.call(args).await
}
})
.collect();
futures::future::join_all(futures).await
}
}