lib/grammar/ast/test/
size.rs1use 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}