use std::sync::Arc;
use async_trait::async_trait;
use crate::core::{DynTool, ReadonlyContext};
use crate::error::Result;
#[async_trait]
pub trait Toolset: Send + Sync + std::fmt::Debug + 'static {
async fn list_tools(&self, ctx: &ReadonlyContext) -> Result<Vec<Arc<dyn DynTool>>>;
async fn shutdown(&self) -> Result<()> {
Ok(())
}
}
#[derive(Debug, Default, Clone)]
pub struct StaticToolset {
tools: Vec<Arc<dyn DynTool>>,
}
impl StaticToolset {
pub fn new(tools: Vec<Arc<dyn DynTool>>) -> Self {
Self { tools }
}
pub fn push(&mut self, t: Arc<dyn DynTool>) {
self.tools.push(t);
}
}
#[async_trait]
impl Toolset for StaticToolset {
async fn list_tools(&self, _ctx: &ReadonlyContext) -> Result<Vec<Arc<dyn DynTool>>> {
Ok(self.tools.clone())
}
}