readme_demo/
readme_demo.rs

1#![allow(dead_code)]
2
3use serde::{Deserialize};
4use schemars::JsonSchema;
5use semantic_query::{clients::{flexible::FlexibleClient, ClaudeConfig}, core::{QueryResolver, RetryConfig}};
6
7#[derive(Debug, Deserialize, JsonSchema)]
8struct QuizQuestion {
9    /// The main question text to be asked
10    pub question: String,
11    /// A brief description or context for the question
12    pub description: String,
13    /// Answer choice A
14    pub a: String,
15    /// Answer choice B
16    pub b: String,
17    /// Answer choice C
18    pub c: String,
19    /// Answer choice D
20    pub d: String,
21    /// The correct answer (must be exactly one of: A, B, C, or D)
22    #[schemars(regex(pattern = r"^[ABCD]$"))]
23    pub correct_answer: String,
24}
25
26#[derive(Debug, Deserialize, JsonSchema)]
27struct Quiz {
28    pub questions: Vec<QuizQuestion>,
29}
30
31#[tokio::main]
32async fn main() -> Result<(), Box<dyn std::error::Error>> {
33    // Create Claude client (reads ANTHROPIC_API_KEY from environment)
34    let client = FlexibleClient::claude(ClaudeConfig::default());
35    let resolver = QueryResolver::new(client, RetryConfig::default());
36    
37    // Get 10 science quiz questions
38    let quiz: Quiz = resolver.query(
39        "Create 10 high school science quiz questions with A, B, C, D answers".to_string()
40    ).await?;
41    
42    // Administer the quiz
43    administer_quiz(quiz.questions).await;
44    Ok(())
45}
46
47async fn administer_quiz(questions: Vec<QuizQuestion>) {
48    let mut score = 0;
49    let total = questions.len();
50    
51    for (i, question) in questions.iter().enumerate() {
52        println!("\nQuestion {}: {}", i + 1, question.question);
53        println!("A) {}", question.a);
54        println!("B) {}", question.b);
55        println!("C) {}", question.c);
56        println!("D) {}", question.d);
57        
58        let mut input = String::new();
59        std::io::stdin().read_line(&mut input).unwrap();
60        let answer = input.trim().to_uppercase();
61        
62        if answer == question.correct_answer.to_uppercase() {
63            score += 1;
64        }
65    }
66    
67    println!("\n🎯 Quiz Complete! Final Score: {}/{} ({}%)", 
68             score, total, (score * 100) / total);
69}