use std::sync::Arc;
use futures_util::future::BoxFuture;
use serde_json::{Map, Value};
use tokio_util::sync::CancellationToken;
use yapi_types::event::ToolResult;
use yapi_types::message::ToolDeclaration;
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub enum ExecutionMode {
#[default]
Parallel,
Sequential,
}
pub type UpdateSink = Arc<dyn Fn(ToolResult) + Send + Sync>;
pub trait Tool: Send + Sync {
fn declaration(&self) -> &ToolDeclaration;
fn label(&self) -> &str {
&self.declaration().name
}
fn execution_mode(&self) -> ExecutionMode {
ExecutionMode::Parallel
}
fn output_schema(&self) -> Option<&Value> {
None
}
fn prepare_arguments(&self, arguments: Map<String, Value>) -> Map<String, Value> {
arguments
}
fn execute(
&self,
call_id: String,
args: Value,
cancel: CancellationToken,
updates: UpdateSink,
) -> BoxFuture<'_, Result<ToolResult, String>>;
}