tml_parser 1.0.6

The official parser for the TML language
use crate::lexer;
use crate::lexer::LexerTrait;

macro_rules! tokens {
    [$($ty:ident => $lit:literal),*] => {
        {
            let mut v: Vec<lexer::Token> = Vec::new();

            $(
                v.push(lexer::Token{token_type: lexer::Keyword::$ty, token_literal: $lit.parse().unwrap(), position: (0, 0)});
            )*

            v
        }
    };
}

#[test]
fn lex() {
    let input: String = "
some comments about the workout
# Squat
60kg x 3 x 5 @ 6.5
60kg x 3 x 5 @ 6
good squat session

# Deadlift
60kg x 3 x 5 @ 6
60kg x 3 x 5 @ 6.4
good deadlift session

# Push-up
5 x 3
".parse().unwrap();

    let mut l = lexer::Lexer::new(input.as_str());

    let correct_tokens: Vec<lexer::Token> = tokens![
        DELIMITER => "\n",
        TEXT => "some comments about the workout\n",
        HASH => "#",
        IDENT => "Squat",
        DELIMITER => "\n",
        NUMBER => "60",
        LABEL => "kg",
        CROSS => "x",
        NUMBER => "3",
        CROSS => "x",
        NUMBER => "5",
        AT => "@",
        NUMBER => "6.5",
        DELIMITER => "\n",
        NUMBER => "60",
        LABEL => "kg",
        CROSS => "x",
        NUMBER => "3",
        CROSS => "x",
        NUMBER => "5",
        AT => "@",
        NUMBER => "6",
        DELIMITER => "\n",
        TEXT => "good squat session\n",
        DELIMITER => "\n",
        HASH => "#",
        IDENT => "Deadlift",
        DELIMITER => "\n",
        NUMBER => "60",
        LABEL => "kg",
        CROSS => "x",
        NUMBER => "3",
        CROSS => "x",
        NUMBER => "5",
        AT => "@",
        NUMBER => "6",
        DELIMITER => "\n",
        NUMBER => "60",
        LABEL => "kg",
        CROSS => "x",
        NUMBER => "3",
        CROSS => "x",
        NUMBER => "5",
        AT => "@",
        NUMBER => "6.4",
        DELIMITER => "\n",
        TEXT => "good deadlift session\n",
        DELIMITER => "\n",
        HASH => "#",
        IDENT => "Push-up",
        DELIMITER => "\n",
        NUMBER => "5",
        CROSS => "x",
        NUMBER => "3",
        DELIMITER => "\n",
        EOF => ""
    ];

    let mut tokens: Vec<lexer::Token> = tokens![];

    loop {
        let tok = l.next_token();

        tokens.push(tok.clone());

        if (&tok).token_type == lexer::Keyword::EOF {
            break
        }
    }

    assert_eq!(correct_tokens.len(), tokens.len());

    let mut i = 0;
    for x in tokens {
        assert_eq!(x.token_type, correct_tokens[i].token_type);
        assert_eq!(x.token_literal, correct_tokens[i].token_literal);

        i += 1;
    }
}