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    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}