readme_demo/
readme_demo.rs1#![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 pub question: String,
11 pub description: String,
13 pub a: String,
15 pub b: String,
17 pub c: String,
19 pub d: String,
21 #[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 let client = FlexibleClient::claude(ClaudeConfig::default());
35 let resolver = QueryResolver::new(client, RetryConfig::default());
36
37 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_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}