#![cfg(feature = "schemars")]
#![allow(dead_code)]
use schemars::JsonSchema;
use serde::Deserialize;
use synaptic_core::SynapticError;
use synaptic_core::Tool;
use synaptic_macros::tool;
#[derive(Deserialize, JsonSchema)]
struct UserInfo {
name: String,
age: i32,
email: Option<String>,
}
#[tool]
async fn process_user(
user: UserInfo,
action: String,
) -> Result<String, SynapticError> {
Ok(format!("{}: {}", user.name, action))
}
#[tokio::test]
async fn custom_type_has_full_schema() {
let tool = process_user();
let params = tool.parameters().unwrap();
let props = params["properties"].as_object().unwrap();
assert_eq!(props["action"]["type"], "string");
let user_schema = props["user"].as_object().unwrap();
assert_eq!(user_schema["type"], "object");
let user_props = user_schema["properties"].as_object().unwrap();
assert_eq!(user_props["name"]["type"], "string");
assert_eq!(user_props["age"]["type"], "integer");
assert!(user_props.contains_key("email"));
}
#[derive(Deserialize, JsonSchema)]
struct Address {
street: String,
city: String,
zip: String,
}
#[derive(Deserialize, JsonSchema)]
struct Customer {
name: String,
address: Address,
}
#[tool]
async fn process_order(
customer: Customer,
item: String,
) -> Result<String, SynapticError> {
Ok(format!("{} ordered {}", customer.name, item))
}
#[tokio::test]
async fn nested_custom_type_has_schema() {
let tool = process_order();
let params = tool.parameters().unwrap();
let props = params["properties"].as_object().unwrap();
assert_eq!(props["item"]["type"], "string");
let customer_schema = props["customer"].as_object().unwrap();
assert_eq!(customer_schema["type"], "object");
let customer_props = customer_schema["properties"].as_object().unwrap();
assert_eq!(customer_props["name"]["type"], "string");
assert!(customer_props.contains_key("address"));
}
#[tool]
async fn maybe_user(
user: Option<UserInfo>,
) -> Result<String, SynapticError> {
match user {
Some(u) => Ok(format!("Got user: {}", u.name)),
None => Ok("No user".into()),
}
}
#[tokio::test]
async fn optional_custom_type_has_schema() {
let tool = maybe_user();
let params = tool.parameters().unwrap();
let props = params["properties"].as_object().unwrap();
let user_schema = props["user"].as_object().unwrap();
assert_eq!(user_schema["type"], "object");
let user_props = user_schema["properties"].as_object().unwrap();
assert_eq!(user_props["name"]["type"], "string");
let required = params["required"].as_array().unwrap();
assert!(required.is_empty());
}