lib/grammar/ast/test/
size.rs

1use pest::iterators::Pair;
2use serde::Serialize;
3
4use crate::grammar::ast::literal::{Literal, LiteralTypes};
5use crate::grammar::ast::Quantifiers;
6use crate::grammar::parser::Rule;
7
8#[derive(Debug, Clone, Eq, PartialEq, Serialize)]
9#[serde(rename_all = "lowercase")]
10pub enum TestSizeArgument {
11    Over,
12    Under,
13}
14
15#[derive(Debug, Clone, Eq, PartialEq, Serialize)]
16#[serde(tag = "kind")]
17pub struct TestSize {
18    pub argument: Option<TestSizeArgument>,
19    pub value: Option<LiteralTypes>,
20    pub quantifier: Option<Quantifiers>,
21}
22
23impl Default for TestSize {
24    fn default() -> Self {
25        Self {
26            argument: None,
27            value: None,
28            quantifier: None,
29        }
30    }
31}
32
33impl<'r> From<Pair<'r, Rule>> for TestSize {
34    fn from(pair: Pair<'r, Rule>) -> Self {
35        let mut test_size = Self::default();
36
37        for p in pair.into_inner().into_iter() {
38            let inner = match p.clone().into_inner().next() {
39                Some(inner) => inner,
40                None => p.clone(),
41            };
42
43            match p.as_rule() {
44                Rule::test_size_argument => {
45                    test_size.argument = match p.as_str() {
46                        "over" => Some(TestSizeArgument::Over),
47                        "under" => Some(TestSizeArgument::Under),
48                        _ => {
49                            unreachable!("Expected pair to be an TestSizeArgument")
50                        }
51                    }
52                }
53                Rule::number => {
54                    test_size.value = Some(Literal::from(inner).inner());
55                }
56                Rule::quantifier => {
57                    test_size.quantifier = Some(Quantifiers::from(inner));
58                }
59                _ => {
60                    unreachable!("Unexpected {:?} token inside test size", p.as_rule())
61                }
62            }
63        }
64
65        test_size
66    }
67}