use serde::{Deserialize, Serialize};
use super::InputSchema;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ToolDefinition {
pub name: String,
pub description: String,
#[serde(rename = "inputSchema")]
pub input_schema: InputSchema,
}
impl ToolDefinition {
pub fn new(
name: impl Into<String>,
description: impl Into<String>,
input_schema: InputSchema,
) -> Self {
Self {
name: name.into(),
description: description.into(),
input_schema,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_new_definition() {
let def = ToolDefinition::new("greet", "Greet someone", InputSchema::object());
assert_eq!(def.name, "greet");
assert_eq!(def.description, "Greet someone");
assert_eq!(def.input_schema.schema_type, "object");
}
#[test]
fn test_definition_serialize() {
let def = ToolDefinition::new(
"greet",
"Greet someone",
InputSchema::object().with_properties(serde_json::json!({
"name": {"type": "string"}
})),
);
let json = serde_json::to_value(&def).unwrap();
assert_eq!(json["name"], "greet");
assert_eq!(json["description"], "Greet someone");
assert_eq!(json["inputSchema"]["type"], "object");
assert_eq!(json["inputSchema"]["properties"]["name"]["type"], "string");
}
}