lib/grammar/ast/test/
header.rs

1use pest::iterators::Pair;
2use serde::Serialize;
3
4use crate::grammar::ast::literal::{Literal, LiteralTypes};
5use crate::grammar::ast::Comparators;
6use crate::grammar::parser::Rule;
7
8#[derive(Debug, Clone, Eq, PartialEq, Serialize)]
9#[serde(tag = "kind")]
10pub struct TestHeader {
11    pub comparators: Option<Comparators>,
12    pub header: Option<LiteralTypes>,
13    pub key: Option<LiteralTypes>,
14}
15
16impl Default for TestHeader {
17    fn default() -> Self {
18        Self {
19            comparators: None,
20            header: None,
21            key: None,
22        }
23    }
24}
25
26impl<'r> From<Pair<'r, Rule>> for TestHeader {
27    fn from(pair: Pair<'r, Rule>) -> Self {
28        let mut test_header = Self::default();
29
30        for p in pair.into_inner().into_iter() {
31            let inner = match p.clone().into_inner().next() {
32                Some(inner) => inner,
33                None => p.clone(),
34            };
35
36            match p.as_rule() {
37                Rule::comparators => {
38                    test_header.comparators = Some(Comparators::from(inner));
39                }
40                Rule::test_header_argument_header => {
41                    test_header.header = Some(Literal::from(inner).inner());
42                }
43                Rule::test_header_argument_key => {
44                    test_header.key = Some(Literal::from(inner).inner());
45                }
46                _ => {
47                    unreachable!("Unexpected {:?} token inside test header", p.as_rule());
48                }
49            }
50        }
51
52        // pair.into_inner()
53        //     .for_each(|p: Pair<'r, Rule>| match p.as_rule() {
54        //         Rule::comparators => {
55        //             test_header.kind = String::from(format!("{:?}", p.as_rule()));
56        //         }
57        //         Rule::test_header_argument_header => {
58        //             test_header.header = Literal::from(p.into_inner().next().unwrap()).inner();
59        //         }
60        //         Rule::test_header_argument_key => {
61        //             test_header.key = Literal::from(p.into_inner().next().unwrap()).inner();
62        //         }
63        //         _ => {
64        //             println!("Unknown rule: {:?}", p.as_rule());
65        //         }
66        //     });
67
68        test_header
69    }
70}