1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
use crate::{Token, Parsable, TokenIter, ParseError, t};

#[derive(PartialEq, Debug, Clone)]
pub struct TestStruct {
    pub var_type: Token,
    pub var_name: String,
    pub equals_sign: Token,
    pub value: u32,
}

impl Parsable<Token> for TestStruct {
    fn parse<'a>(iter: &mut TokenIter<Token>) -> Result<TestStruct, ParseError<Token>> {
        iter.try_do(|token_iter| {
            let var_type = token_iter.parse_if_match(|token|matches!(token,t!(int)))?;

            let var_name = match token_iter.parse_if_match(|token|matches!(token, Token::Identifier(_)))? {
                Token::Identifier(ident_str) => ident_str,
                _ => unreachable!("Internal error, should be ident_str"),
            };

            let equals_sign = token_iter.parse_if_match(|token|matches!(token,t!( = )))?;
            let value = match token_iter.parse_if_match(|token|matches!(token,Token::LiteralInt(_)))? {
                Token::LiteralInt(value) => value,
                _ => unreachable!("Internal error: should be lit int"),
            };
            Ok(TestStruct {
                var_type,
                var_name,
                equals_sign,
                value,
            })
        })
    }
}