use serde::{ Deserialize, Serialize };
use std::collections::HashMap;
#[ derive( Debug, Clone, Serialize, Deserialize ) ]
pub struct Tool
{
pub name : String,
pub description : String,
pub parameters : ToolParameters,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub required : Option< bool >,
}
impl Tool
{
#[ inline ]
#[ must_use ]
pub fn new(
name : impl Into< String >,
description : impl Into< String >,
parameters : ToolParameters
) -> Self
{
Self
{
name : name.into(),
description : description.into(),
parameters,
required : None,
}
}
#[ inline ]
#[ must_use ]
pub fn with_required( mut self, required : bool ) -> Self
{
self.required = Some( required );
self
}
}
#[ derive( Debug, Clone, Serialize, Deserialize ) ]
pub struct ToolParameters
{
#[ serde( rename = "type" ) ]
pub parameter_type : String,
pub properties : HashMap< String, ParameterProperty >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub required : Option< Vec< String > >,
}
impl Default for ToolParameters
{
#[ inline ]
fn default() -> Self
{
Self::new()
}
}
impl ToolParameters
{
#[ inline ]
#[ must_use ]
pub fn new() -> Self
{
Self
{
parameter_type : "object".to_string(),
properties : HashMap::new(),
required : None,
}
}
#[ inline ]
#[ must_use ]
pub fn with_property( mut self, name : impl Into< String >, property : ParameterProperty ) -> Self
{
self.properties.insert( name.into(), property );
self
}
#[ inline ]
#[ must_use ]
pub fn with_required( mut self, required : Vec< String > ) -> Self
{
self.required = Some( required );
self
}
}
#[ derive( Debug, Clone, Serialize, Deserialize ) ]
pub struct ParameterProperty
{
#[ serde( rename = "type" ) ]
pub property_type : String,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub description : Option< String >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub enum_values : Option< Vec< serde_json::Value > >,
#[ serde( skip_serializing_if = "Option::is_none" ) ]
pub default : Option< serde_json::Value >,
}
impl ParameterProperty
{
#[ inline ]
#[ must_use ]
pub fn string( description : impl Into< String > ) -> Self
{
Self
{
property_type : "string".to_string(),
description : Some( description.into() ),
enum_values : None,
default : None,
}
}
#[ inline ]
#[ must_use ]
pub fn number( description : impl Into< String > ) -> Self
{
Self
{
property_type : "number".to_string(),
description : Some( description.into() ),
enum_values : None,
default : None,
}
}
#[ inline ]
#[ must_use ]
pub fn boolean( description : impl Into< String > ) -> Self
{
Self
{
property_type : "boolean".to_string(),
description : Some( description.into() ),
enum_values : None,
default : None,
}
}
}