1use crate::bytes::matchers::{match_char, match_pattern};
4use crate::matcher::{Match, MatchSize};
5
6#[derive(Copy, Clone)]
7#[derive(PartialEq, Debug)]
9pub enum Token {
10 OpenParen,
12 CloseParen,
14 Comma,
16 Semicolon,
18 Colon,
20 Whitespace,
22 GreaterThan,
24 LessThan,
26 Exclamation,
28 Quote,
30 DoubleQuote,
32 Equal,
34 Plus,
36 Dash,
38 Slash,
40 Star,
42 Percent,
44 Ampersand,
46 Pipe,
48 Caret,
50 Tilde,
52 Dot,
54 Question,
56 At,
58 Hash,
60 Dollar,
62 Backslash,
64 Underscore,
66 Sharp,
68 Ln,
70 Cr,
72 Tab,
74 CrLn,
76}
77
78impl Match<u8> for Token {
79 fn matcher(&self, data: &[u8]) -> (bool, usize) {
80 match self {
81 Token::OpenParen => match_char('(', data),
82 Token::CloseParen => match_char(')', data),
83 Token::Comma => match_char(',', data),
84 Token::Semicolon => match_char(';', data),
85 Token::Colon => match_char(':', data),
86 Token::Whitespace => match_char(' ', data),
87 Token::GreaterThan => match_char('>', data),
88 Token::LessThan => match_char('<', data),
89 Token::Exclamation => match_char('!', data),
90 Token::Quote => match_char('\'', data),
91 Token::DoubleQuote => match_char('"', data),
92 Token::Equal => match_char('=', data),
93 Token::Plus => match_char('+', data),
94 Token::Dash => match_char('-', data),
95 Token::Slash => match_char('/', data),
96 Token::Star => match_char('*', data),
97 Token::Percent => match_char('%', data),
98 Token::Ampersand => match_char('&', data),
99 Token::Pipe => match_char('|', data),
100 Token::Caret => match_char('^', data),
101 Token::Tilde => match_char('~', data),
102 Token::Dot => match_char('.', data),
103 Token::Question => match_char('?', data),
104 Token::At => match_char('@', data),
105 Token::Hash => match_char('#', data),
106 Token::Dollar => match_char('$', data),
107 Token::Backslash => match_char('\\', data),
108 Token::Underscore => match_char('_', data),
109 Token::Sharp => match_char('#', data),
110 Token::Ln => match_char('\n', data),
111 Token::Cr => match_char('\r', data),
112 Token::Tab => match_char('\t', data),
113 Token::CrLn => match_pattern(b"\r\n", data),
114 }
115 }
116}
117
118impl MatchSize for Token {
119 fn size(&self) -> usize {
120 match self {
121 Token::OpenParen => 1,
122 Token::CloseParen => 1,
123 Token::Comma => 1,
124 Token::Semicolon => 1,
125 Token::Colon => 1,
126 Token::Whitespace => 1,
127 Token::GreaterThan => 1,
128 Token::LessThan => 1,
129 Token::Exclamation => 1,
130 Token::Quote => 1,
131 Token::DoubleQuote => 1,
132 Token::Equal => 1,
133 Token::Plus => 1,
134 Token::Dash => 1,
135 Token::Slash => 1,
136 Token::Star => 1,
137 Token::Percent => 1,
138 Token::Ampersand => 1,
139 Token::Pipe => 1,
140 Token::Caret => 1,
141 Token::Tilde => 1,
142 Token::Dot => 1,
143 Token::Question => 1,
144 Token::At => 1,
145 Token::Hash => 1,
146 Token::Dollar => 1,
147 Token::Backslash => 1,
148 Token::Underscore => 1,
149 Token::Sharp => 1,
150 Token::Ln => 1,
151 Token::Cr => 1,
152 Token::Tab => 1,
153 Token::CrLn => 2,
154 }
155 }
156}