test_query_parse/
test_query_parse.rs1use 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}