use rstructor::{Instructor, RStructorError, SchemaType};
use serde::{Deserialize, Serialize};
#[derive(Instructor, Serialize, Deserialize, Debug)]
#[llm(
description = "A product in an inventory system",
validate = "validate_product"
)]
struct Product {
#[llm(description = "Product name", example = "Laptop Pro")]
name: String,
#[llm(description = "Product price in USD", example = 999.99)]
price: f64,
#[llm(description = "Quantity available in inventory", example = 42)]
quantity: u32,
#[llm(description = "Product categories", examples = ["Electronics", "Computers", "Office"])]
categories: Vec<String>,
}
fn validate_product(product: &Product) -> rstructor::Result<()> {
if product.price <= 0.0 {
return Err(RStructorError::ValidationError(format!(
"Product price must be positive, got {}",
product.price
)));
}
if product.name.trim().is_empty() {
return Err(RStructorError::ValidationError(
"Product name cannot be empty".to_string(),
));
}
if product.categories.is_empty() {
return Err(RStructorError::ValidationError(
"Product must have at least one category".to_string(),
));
}
Ok(())
}
fn main() {
let valid_product = Product {
name: "Laptop Pro".to_string(),
price: 1299.99,
quantity: 10,
categories: vec!["Electronics".to_string(), "Computers".to_string()],
};
match <Product as Instructor>::validate(&valid_product) {
Ok(_) => println!("Valid product: {:?}", valid_product),
Err(e) => println!("Validation error: {}", e),
}
let invalid_product = Product {
name: "Broken Item".to_string(),
price: -10.0, quantity: 5,
categories: vec!["Misc".to_string()],
};
match <Product as Instructor>::validate(&invalid_product) {
Ok(_) => println!("Valid product: {:?}", invalid_product),
Err(e) => println!("Validation error: {}", e),
}
let invalid_product2 = Product {
name: "Missing Categories".to_string(),
price: 49.99,
quantity: 100,
categories: vec![], };
match <Product as Instructor>::validate(&invalid_product2) {
Ok(_) => println!("Valid product: {:?}", invalid_product2),
Err(e) => println!("Validation error: {}", e),
}
println!("\nJSON Schema for Product:");
println!("{}", Product::schema());
}