struct MathTools;
#[async_trait]
impl AgentToolDispatcher for MathTools {
fn tools(&self) -> Arc<[Arc<ToolDef>]> {
vec![Arc::new(ToolDef {
name: "add".to_string(),
description: "Add two numbers".to_string(),
input_schema: json!({
"type": "object",
"properties": {
"a": {"type": "number"},
"b": {"type": "number"}
},
"required": ["a", "b"]
}),
})].into()
}
async fn dispatch(&self, call: ToolCallView<'_>) -> Result<ToolResult, ToolError> {
match call.name {
"add" => {
let args: AddArgs = call.parse_args()
.map_err(|e| ToolError::InvalidArguments(e.to_string()))?;
Ok(ToolResult::success(call.id, format!("{}", args.a + args.b)))
}
_ => Err(ToolError::not_found(call.name)),
}
}
}