use std::collections::HashMap;
use serde::{ Serialize, Deserialize };
use crate::error::Result;
#[ async_trait::async_trait ]
pub trait CustomTool : Send + Sync
{
fn name( &self ) -> &str;
fn description( &self ) -> &str;
fn parameters( &self ) -> ToolParameters;
async fn execute( &self, parameters : serde_json::Value ) -> Result< ToolResult >;
}
#[ derive( Debug, Clone, Serialize, Deserialize ) ]
pub struct ToolParameters
{
pub required : Vec< String >,
pub properties : HashMap< String, ParameterDefinition >,
}
#[ derive( Debug, Clone, Serialize, Deserialize ) ]
pub struct ParameterDefinition
{
pub param_type : String,
pub description : String,
pub required : bool,
pub default : Option< serde_json::Value >,
}
#[ derive( Debug, Clone, Serialize, Deserialize ) ]
pub struct ToolResult
{
pub output : serde_json::Value,
pub success : bool,
pub error_message : Option< String >,
}