Skip to main content

httpql/
lib.rs

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}