use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ToolDefinition {
pub name: &'static str,
pub description: &'static str,
pub parameters: &'static str,
}
impl ToolDefinition {
pub const fn new(
name: &'static str,
description: &'static str,
parameters: &'static str,
) -> Self {
Self {
name,
description,
parameters,
}
}
pub fn to_openai_format(&self) -> serde_json::Value {
serde_json::json!({
"type": "function",
"function": {
"name": self.name,
"description": self.description,
"parameters": serde_json::from_str::<serde_json::Value>(self.parameters)
.unwrap_or(serde_json::json!({}))
}
})
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_tool_definition() {
const TEST_TOOL: ToolDefinition =
ToolDefinition::new("test_tool", "A test tool", r#"{"type": "object"}"#);
assert_eq!(TEST_TOOL.name, "test_tool");
assert_eq!(TEST_TOOL.description, "A test tool");
}
#[test]
fn test_openai_format() {
let tool = ToolDefinition::new(
"search",
"Search the web",
r#"{"type": "object", "properties": {"query": {"type": "string"}}}"#,
);
let json = tool.to_openai_format();
assert_eq!(json["type"], "function");
assert_eq!(json["function"]["name"], "search");
}
}