1pub use self::error::*;
2pub use self::primitives::*;
3
4mod error;
5mod parser;
6mod primitives;
7
8pub struct HTTPQL;
9
10impl HTTPQL {
11 pub fn parse(input: &str) -> Result<Query> {
12 parser::parse(input)
13 }
14}
15
16#[cfg(test)]
17mod tests {
18 use regex::Regex;
19 use rstest::rstest;
20 use serde::Deserialize;
21
22 use super::*;
23
24 #[derive(Deserialize)]
25 #[serde(tag = "expect", rename_all = "snake_case")]
26 enum Test {
27 Ok { input: String, result: bool },
28 Err,
29 }
30
31 #[rstest]
32 #[case(1)]
33 #[case(2)]
34 #[case(3)]
35 #[case(4)]
36 #[case(5)]
37 #[case(6)]
38 #[case(7)]
39 #[case(8)]
40 #[case(9)]
41 #[case(10)]
42 #[case(11)]
43 #[case(12)]
44 #[case(13)]
45 #[case(14)]
46 #[case(15)]
47 #[case(16)]
48 #[case(17)]
49 #[case(18)]
50 #[case(19)]
51 fn test_ast(#[case] case: u32) {
52 let input = std::fs::read_to_string(format!("../tests/ast/{case}/input.httpql")).unwrap();
53 let output = std::fs::read_to_string(format!("../tests/ast/{case}/output.ast")).unwrap();
54 let query = HTTPQL::parse(&input).unwrap();
55 assert_eq!(output.trim(), query.to_string().trim());
56 }
57
58 #[rstest]
59 #[case(1)]
60 #[case(2)]
61 #[case(3)]
62 #[case(4)]
63 #[case(5)]
64 #[case(6)]
65 fn test_error(#[case] case: u32) {
66 let input = std::fs::read_to_string(format!("../tests/error/{case}/input.httpql")).unwrap();
67 assert!(HTTPQL::parse(&input).is_err());
68 }
69
70 #[rstest]
71 #[case(1)]
72 #[case(2)]
73 #[case(3)]
74 #[case(4)]
75 #[case(5)]
76 #[case(6)]
77 #[case(7)]
78 #[case(8)]
79 fn test_regex(#[case] case: u32) {
80 let input =
81 std::fs::read_to_string(format!("../tests/regex/{}/input.httpql", case)).unwrap();
82 let test = serde_json::from_str::<Test>(
83 &std::fs::read_to_string(format!("../tests/regex/{}/test.json", case)).unwrap(),
84 )
85 .unwrap();
86
87 let query = HTTPQL::parse(&input);
88 match test {
89 Test::Err if query.is_err() => (),
90 Test::Err => panic!("Expected error"),
91 Test::Ok { input, result } => {
92 let expr = query.unwrap().request.unwrap().raw.unwrap();
93 let regex = Regex::new(&expr.value).unwrap();
94 assert_eq!(regex.is_match(&input), result);
95 }
96 }
97 }
98
99 #[rstest]
100 #[case(1)]
101 #[case(2)]
102 fn test_string(#[case] case: u32) {
103 let input =
104 std::fs::read_to_string(format!("../tests/string/{}/input.httpql", case)).unwrap();
105 let test = serde_json::from_str::<Test>(
106 &std::fs::read_to_string(format!("../tests/string/{}/test.json", case)).unwrap(),
107 )
108 .unwrap();
109
110 let query = HTTPQL::parse(&input);
111 match test {
112 Test::Err if query.is_err() => (),
113 Test::Err => panic!("Expected error"),
114 Test::Ok { input, result } => {
115 let expr = query.unwrap().request.unwrap().raw.unwrap();
116 assert_eq!(expr.value == input, result);
117 }
118 }
119 }
120}