use std::collections::HashMap;
use std::sync::Arc;
use claude_rust_types::Tool;
use serde_json::{Value, json};
pub struct ToolRegistry {
tools: HashMap<String, Arc<dyn Tool>>,
}
impl ToolRegistry {
pub fn new() -> Self {
Self {
tools: HashMap::new(),
}
}
pub fn register(&mut self, tool: Arc<dyn Tool>) {
self.tools.insert(tool.name().to_string(), tool);
}
pub fn get(&self, name: &str) -> Option<&Arc<dyn Tool>> {
self.tools.get(name)
}
pub fn tool_definitions(&self) -> Vec<Value> {
self.tools
.values()
.map(|t| {
json!({
"name": t.name(),
"description": t.description(),
"input_schema": t.input_schema(),
})
})
.collect()
}
}
impl Default for ToolRegistry {
fn default() -> Self {
Self::new()
}
}