noa_parser/bytes/
token.rs

1//! Classic tokens
2
3use crate::bytes::matchers::match_char;
4use crate::matcher::{Match, MatchSize};
5
6#[derive(Copy, Clone)]
7/// The token type
8#[derive(PartialEq, Debug)]
9pub enum Token {
10    /// The "(" character
11    OpenParen,
12    /// The `)` character
13    CloseParen,
14    /// The `,` character
15    Comma,
16    /// The `;` character
17    Semicolon,
18    /// The `:` character
19    Colon,
20    /// The whitespace character
21    Whitespace,
22    /// The `>` character
23    GreaterThan,
24    /// The `<` character
25    LessThan,
26    /// The `!` character
27    Exclamation,
28    /// The `'` character
29    Quote,
30    /// The `"` character
31    DoubleQuote,
32    /// The `=` character
33    Equal,
34    /// The `+` character
35    Plus,
36    /// The `-` character
37    Dash,
38    /// The `/` character
39    Slash,
40    /// The `*` character
41    Star,
42    /// The `%` character
43    Percent,
44    /// The `&` character
45    Ampersand,
46    /// The `|` character
47    Pipe,
48    /// The `^` character
49    Caret,
50    /// The `~` character
51    Tilde,
52    /// The `.` character
53    Dot,
54    /// The `?` character
55    Question,
56    /// The `@` character
57    At,
58    /// The `#` character
59    Hash,
60    /// The `$` character
61    Dollar,
62    /// The `\\` character
63    Backslash,
64    /// The `_` character
65    Underscore,
66    /// The `#` character
67    Sharp,
68}
69
70impl Match<u8> for Token {
71    fn matcher(&self, data: &[u8]) -> (bool, usize) {
72        match self {
73            Token::OpenParen => match_char('(', data),
74            Token::CloseParen => match_char(')', data),
75            Token::Comma => match_char(',', data),
76            Token::Semicolon => match_char(';', data),
77            Token::Colon => match_char(':', data),
78            Token::Whitespace => match_char(' ', data),
79            Token::GreaterThan => match_char('>', data),
80            Token::LessThan => match_char('<', data),
81            Token::Exclamation => match_char('!', data),
82            Token::Quote => match_char('\'', data),
83            Token::DoubleQuote => match_char('"', data),
84            Token::Equal => match_char('=', data),
85            Token::Plus => match_char('+', data),
86            Token::Dash => match_char('-', data),
87            Token::Slash => match_char('/', data),
88            Token::Star => match_char('*', data),
89            Token::Percent => match_char('%', data),
90            Token::Ampersand => match_char('&', data),
91            Token::Pipe => match_char('|', data),
92            Token::Caret => match_char('^', data),
93            Token::Tilde => match_char('~', data),
94            Token::Dot => match_char('.', data),
95            Token::Question => match_char('?', data),
96            Token::At => match_char('@', data),
97            Token::Hash => match_char('#', data),
98            Token::Dollar => match_char('$', data),
99            Token::Backslash => match_char('\\', data),
100            Token::Underscore => match_char('_', data),
101            Token::Sharp => match_char('#', data),
102        }
103    }
104}
105
106impl MatchSize for Token {
107    fn size(&self) -> usize {
108        match self {
109            Token::OpenParen => 1,
110            Token::CloseParen => 1,
111            Token::Comma => 1,
112            Token::Semicolon => 1,
113            Token::Colon => 1,
114            Token::Whitespace => 1,
115            Token::GreaterThan => 1,
116            Token::LessThan => 1,
117            Token::Exclamation => 1,
118            Token::Quote => 1,
119            Token::DoubleQuote => 1,
120            Token::Equal => 1,
121            Token::Plus => 1,
122            Token::Dash => 1,
123            Token::Slash => 1,
124            Token::Star => 1,
125            Token::Percent => 1,
126            Token::Ampersand => 1,
127            Token::Pipe => 1,
128            Token::Caret => 1,
129            Token::Tilde => 1,
130            Token::Dot => 1,
131            Token::Question => 1,
132            Token::At => 1,
133            Token::Hash => 1,
134            Token::Dollar => 1,
135            Token::Backslash => 1,
136            Token::Underscore => 1,
137            Token::Sharp => 1,
138        }
139    }
140}