use std::collections::HashMap;
use std::sync::Arc;
use autoagents_core::tool::ToolT;
use crate::state::ToolSchema;
#[derive(Clone, Default)]
pub struct ToolRegistry {
tools: Arc<HashMap<String, Arc<dyn ToolT>>>,
}
impl ToolRegistry {
pub fn builder() -> ToolRegistryBuilder {
ToolRegistryBuilder::default()
}
pub fn get(&self, name: &str) -> Option<&Arc<dyn ToolT>> {
self.tools.get(name)
}
pub fn names(&self) -> impl Iterator<Item = &str> {
self.tools.keys().map(String::as_str)
}
pub fn to_schemas(&self) -> Vec<ToolSchema> {
self.tools
.values()
.map(|t| ToolSchema {
name: t.name().to_string(),
description: t.description().to_string(),
args_schema: t.args_schema(),
})
.collect()
}
}
#[derive(Default)]
pub struct ToolRegistryBuilder {
tools: HashMap<String, Arc<dyn ToolT>>,
}
impl ToolRegistryBuilder {
#[allow(clippy::should_implement_trait)]
#[must_use]
pub fn add(mut self, tool: Arc<dyn ToolT>) -> Self {
self.tools.insert(tool.name().to_string(), tool);
self
}
pub fn build(self) -> ToolRegistry {
ToolRegistry {
tools: Arc::new(self.tools),
}
}
}