lib/grammar/ast/test/
header.rs1use 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 test_header
69 }
70}