use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FunctionSchema {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub parameters: Option<Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub strict: Option<bool>,
}
impl FunctionSchema {
pub fn new(name: impl Into<String>, description: impl Into<String>) -> Self {
Self {
name: name.into(),
description: Some(description.into()),
parameters: None,
strict: None,
}
}
pub fn with_parameters(mut self, params: Value) -> Self {
self.parameters = Some(params);
self
}
pub fn with_strict(mut self, strict: bool) -> Self {
self.strict = Some(strict);
self
}
pub fn to_default_dict(&self) -> Value {
let mut map = serde_json::Map::new();
map.insert("name".into(), Value::String(self.name.clone()));
if let Some(desc) = &self.description {
map.insert("description".into(), Value::String(desc.clone()));
}
if let Some(params) = &self.parameters {
map.insert("parameters".into(), params.clone());
}
if let Some(strict) = self.strict {
map.insert("strict".into(), Value::Bool(strict));
}
Value::Object(map)
}
}