luau_lexer/token/
symbol.rs

1//! [`Symbol`] struct.
2
3use std::fmt::Write;
4
5/// Generates the [`Symbol`] enum.
6macro_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            /// `.`
16            Dot,
17
18            /// `...`
19            Ellipses,
20
21            /// `->`
22            Arrow,
23
24            /// `::`
25            Typecast,
26        }
27
28        impl $struct {
29            /// Try creating the current item from a character
30            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    /// A luau symbol like `(` and `)`
59    pub enum Symbol {
60        /// `{`
61        '{' => OpeningCurlyBrackets,
62
63        /// `}`
64        '}' => ClosingCurlyBrackets,
65
66        /// `[`
67        '[' => OpeningBrackets,
68
69        /// `]`
70        ']' => ClosingBrackets,
71
72        /// `<`
73        '<' => OpeningAngleBrackets,
74
75        /// `>`
76        '>' => ClosingAngleBrackets,
77
78        /// `(`
79        '(' => OpeningParenthesis,
80
81        /// `)`
82        ')' => ClosingParenthesis,
83
84        /// `;`
85        ';' => Semicolon,
86
87        /// `:`
88        ':' => Colon,
89
90        /// `=`
91        '=' => Equal,
92
93        /// `,`
94        ',' => Comma,
95
96        /// `@`
97        '@' => At,
98    }
99);