test_query_parse/
test_query_parse.rs

1//! Test query file parsing
2
3use qail_core::parser::query_file::QueryFile;
4
5fn main() {
6    let queries_content = r#"
7-- User queries
8query find_user(id: Uuid) -> User:
9  get users where id = :id
10
11query list_users() -> Vec<User>:
12  get users order by created_at desc
13
14query find_by_email(email: String) -> Option<User>:
15  get users where email = :email limit 1
16
17execute create_user(email: String, name: String):
18  add::users : email, name [ :email, :name ]
19
20execute delete_user(id: Uuid):
21  del::users where id = :id
22"#;
23
24    println!("Testing query file parsing...\n");
25
26    match QueryFile::parse(queries_content) {
27        Ok(qf) => {
28            println!("✓ Parsed {} queries\n", qf.queries.len());
29
30            for q in &qf.queries {
31                let kind = if q.is_execute { "execute" } else { "query" };
32                let params: Vec<_> = q
33                    .params
34                    .iter()
35                    .map(|p| format!("{}: {}", p.name, p.typ))
36                    .collect();
37
38                let return_type = match &q.return_type {
39                    Some(qail_core::parser::query_file::ReturnType::Single(t)) => {
40                        format!("-> {}", t)
41                    }
42                    Some(qail_core::parser::query_file::ReturnType::Vec(t)) => {
43                        format!("-> Vec<{}>", t)
44                    }
45                    Some(qail_core::parser::query_file::ReturnType::Option(t)) => {
46                        format!("-> Option<{}>", t)
47                    }
48                    None => String::new(),
49                };
50
51                println!("{} {}({}) {}", kind, q.name, params.join(", "), return_type);
52                println!("  body: {}", q.body.lines().next().unwrap_or(""));
53                println!();
54            }
55
56            println!("✓ All query parsing tests passed!");
57        }
58        Err(e) => {
59            eprintln!("✗ Parse error: {}", e);
60            std::process::exit(1);
61        }
62    }
63}