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 #[case(20)]
52 #[case(21)]
53 #[case(22)]
54 #[case(23)]
55 #[case(24)]
56 #[case(25)]
57 fn test_ast(#[case] case: u32) {
58 let input =
59 std::fs::read_to_string(format!("../../tests/httpql/ast/{case}/input.httpql")).unwrap();
60 let output =
61 std::fs::read_to_string(format!("../../tests/httpql/ast/{case}/output.ast")).unwrap();
62 let query = HTTPQL::parse(&input).unwrap();
63 assert_eq!(output.trim(), query.to_string().trim());
64 }
65
66 #[rstest]
67 #[case(1)]
68 #[case(2)]
69 #[case(3)]
70 #[case(4)]
71 #[case(5)]
72 #[case(6)]
73 fn test_error(#[case] case: u32) {
74 let input =
75 std::fs::read_to_string(format!("../../tests/httpql/error/{case}/input.httpql"))
76 .unwrap();
77 assert!(HTTPQL::parse(&input).is_err());
78 }
79
80 #[rstest]
81 #[case(1)]
82 #[case(2)]
83 #[case(3)]
84 #[case(4)]
85 #[case(5)]
86 #[case(6)]
87 #[case(7)]
88 #[case(8)]
89 fn test_regex(#[case] case: u32) {
90 let input =
91 std::fs::read_to_string(format!("../../tests/httpql/regex/{}/input.httpql", case))
92 .unwrap();
93 let test = serde_json::from_str::<Test>(
94 &std::fs::read_to_string(format!("../../tests/httpql/regex/{}/test.json", case))
95 .unwrap(),
96 )
97 .unwrap();
98
99 let query = HTTPQL::parse(&input);
100 match test {
101 Test::Err if query.is_err() => (),
102 Test::Err => panic!("Expected error"),
103 Test::Ok { input, result } => {
104 let expr = query.unwrap().request.unwrap().raw.unwrap();
105 let regex = Regex::new(&expr.value).unwrap();
106 assert_eq!(regex.is_match(&input), result);
107 }
108 }
109 }
110
111 #[rstest]
112 #[case(1)]
113 #[case(2)]
114 fn test_string(#[case] case: u32) {
115 let input =
116 std::fs::read_to_string(format!("../../tests/httpql/string/{}/input.httpql", case))
117 .unwrap();
118 let test = serde_json::from_str::<Test>(
119 &std::fs::read_to_string(format!("../../tests/httpql/string/{}/test.json", case))
120 .unwrap(),
121 )
122 .unwrap();
123
124 let query = HTTPQL::parse(&input);
125 match test {
126 Test::Err if query.is_err() => (),
127 Test::Err => panic!("Expected error"),
128 Test::Ok { input, result } => {
129 let expr = query.unwrap().request.unwrap().raw.unwrap();
130 assert_eq!(expr.value == input, result);
131 }
132 }
133 }
134}