use std::collections::HashMap;
use std::sync::Arc;
use crate::error::{SdkError, SdkResult};
use crate::traits::tool::{Tool, ToolDefinition};
pub struct ToolRegistry {
tools: HashMap<String, Arc<dyn Tool>>,
}
impl Default for ToolRegistry {
fn default() -> Self {
Self::new()
}
}
impl ToolRegistry {
pub fn new() -> Self {
Self {
tools: HashMap::new(),
}
}
pub fn register(&mut self, tool: Arc<dyn Tool>) {
let def = tool.definition();
self.tools.insert(def.name.clone(), tool);
}
pub fn definitions(&self) -> Vec<ToolDefinition> {
self.tools.values().map(|t| t.definition()).collect()
}
pub async fn execute(
&self,
name: &str,
arguments: serde_json::Value,
) -> SdkResult<serde_json::Value> {
let tool = self.tools.get(name).ok_or_else(|| SdkError::ToolExecution {
tool_name: name.to_string(),
message: format!("Tool '{}' not found in registry", name),
})?;
tool.execute(arguments).await
}
pub fn tool_names(&self) -> Vec<&str> {
self.tools.keys().map(|s| s.as_str()).collect()
}
pub fn is_empty(&self) -> bool {
self.tools.is_empty()
}
}