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.params.iter()
33                    .map(|p| format!("{}: {}", p.name, p.typ))
34                    .collect();
35                
36                let return_type = match &q.return_type {
37                    Some(qail_core::parser::query_file::ReturnType::Single(t)) => format!("-> {}", t),
38                    Some(qail_core::parser::query_file::ReturnType::Vec(t)) => format!("-> Vec<{}>", t),
39                    Some(qail_core::parser::query_file::ReturnType::Option(t)) => format!("-> Option<{}>", t),
40                    None => String::new(),
41                };
42                
43                println!("{} {}({}) {}", kind, q.name, params.join(", "), return_type);
44                println!("  body: {}", q.body.lines().next().unwrap_or(""));
45                println!();
46            }
47            
48            println!("✓ All query parsing tests passed!");
49        }
50        Err(e) => {
51            eprintln!("✗ Parse error: {}", e);
52            std::process::exit(1);
53        }
54    }
55}