use llm_toolkit::ToPrompt;
use llm_toolkit::agent::Agent;
use llm_toolkit::agent::impls::ClaudeCodeAgent;
use llm_toolkit::agent::payload::Payload;
use llm_toolkit::extract_json;
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Debug, Clone, ToPrompt, PartialEq)]
enum Priority {
Critical,
High,
Medium,
Low,
}
#[derive(Serialize, Deserialize, Debug, Clone, ToPrompt)]
#[prompt(mode = "full")]
struct Task {
title: String,
description: String,
priority: Priority,
completed: bool,
}
#[tokio::main(flavor = "current_thread")]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init();
println!("๐งช Testing LLM JSON Generation with TypeScript Schema\n");
if !ClaudeCodeAgent::is_available() {
eprintln!("โ claude CLI not found in PATH");
eprintln!("\n๐ก This test requires Claude CLI. Skipping...");
println!("โ
Test skipped (no Claude CLI available)");
return Ok(());
}
println!("โ
claude CLI found\n");
let task_schema = Task::prompt_schema();
let priority_schema = Priority::prompt_schema();
println!("๐ Generated Schemas:\n");
println!("--- Priority Enum ---");
println!("{}\n", priority_schema);
println!("--- Task Struct ---");
println!("{}\n", task_schema);
let prompt = format!(
r#"Generate a JSON object matching these TypeScript type definitions:
{}
{}
Generate a task about "Fix the login bug". Return ONLY the JSON, no markdown code blocks."#,
priority_schema, task_schema
);
println!("๐ค Calling Claude to generate JSON...\n");
let agent = ClaudeCodeAgent::new();
let payload = Payload::from(prompt);
let response = agent.execute(payload).await;
match response {
Ok(json_str) => {
println!("๐ฅ LLM Response:");
println!("{}\n", json_str);
let extracted = extract_json(&json_str)?;
println!("๐ Attempting to deserialize...");
match serde_json::from_str::<Task>(&extracted) {
Ok(task) => {
println!("โ
Successfully deserialized!");
println!("\n๐ Parsed Task:");
println!(" Title: {}", task.title);
println!(" Description: {}", task.description);
println!(" Priority: {:?}", task.priority);
println!(" Completed: {}", task.completed);
println!("\nโ
Enum deserialization successful!");
println!(" Priority value: {:?}", task.priority);
println!("\n๐ TEST PASSED: LLM generated valid JSON from TypeScript schema");
}
Err(e) => {
eprintln!("โ Deserialization failed: {}", e);
eprintln!("\n๐ TEST FAILED: LLM output doesn't match expected format");
std::process::exit(1);
}
}
}
Err(e) => {
eprintln!("โ LLM call failed: {}", e);
eprintln!("\n๐ TEST FAILED: Could not get response from LLM");
std::process::exit(1);
}
}
Ok(())
}