luau_lexer/token/
symbol.rs1use std::fmt::Write;
4
5macro_rules! generate_symbols {
7 ($(#[$meta:meta])* $vis:vis enum $struct: ident {
8 $( $(#[$name_meta:meta])* $char: literal => $name: ident ),* $(,)?
9 }) => {
10 $(#[$meta])*
11 #[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)]
12 #[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
13 $vis enum $struct {
14 $( $(#[$name_meta])* $name, )*
15 Dot,
17
18 Ellipses,
20
21 Arrow,
23
24 Typecast,
26 }
27
28 impl $struct {
29 pub fn try_from_char(character: char, lexer: &mut crate::prelude::Lexer) -> Option<Self> {
31 let value = match character {
32 $( $char => Some(Self::$name), )*
33 _ => None,
34 };
35 if value.is_some() {
36 lexer.consume(character);
37 }
38
39 value
40 }
41 }
42
43 impl std::fmt::Display for $struct {
44 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
45 match self {
46 Self::Dot => f.write_str("."),
47 Self::Ellipses => f.write_str("..."),
48 Self::Arrow => f.write_str("->"),
49 Self::Typecast => f.write_str("::"),
50 $( Self::$name => f.write_char($char), )*
51 }
52 }
53 }
54 };
55}
56
57generate_symbols!(
58 pub enum Symbol {
60 '{' => OpeningCurlyBrackets,
62
63 '}' => ClosingCurlyBrackets,
65
66 '[' => OpeningBrackets,
68
69 ']' => ClosingBrackets,
71
72 '<' => OpeningAngleBrackets,
74
75 '>' => ClosingAngleBrackets,
77
78 '(' => OpeningParenthesis,
80
81 ')' => ClosingParenthesis,
83
84 ';' => Semicolon,
86
87 ':' => Colon,
89
90 '=' => Equal,
92
93 ',' => Comma,
95
96 '@' => At,
98 }
99);