Skip to main content

oak_tailwind/lexer/
token_type.rs

1//! Token types for the Tailwind DSL.
2use oak_core::{Token, TokenType, UniversalTokenRole};
3
4/// Type alias for a Tailwind token.
5pub type TailwindToken = Token<TailwindTokenType>;
6
7/// Token types for the Tailwind DSL.
8#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
9#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
10pub enum TailwindTokenType {
11    /// The root node of the parse tree.
12    Root,
13    /// A utility class (e.g., `bg-red-500`, `p-4`).
14    Utility,
15    /// A modifier (e.g., `hover:`, `md:`, `dark:`).
16    Modifier,
17    /// An arbitrary value (e.g., `[100px]`, `[#000]`).
18    ArbitraryValue,
19    /// The important flag (`!`).
20    Important,
21    /// A directive (e.g., `@tailwind`, `@apply`, `@layer`).
22    Directive,
23    /// A CSS property name or identifier.
24    Identifier,
25    /// A CSS value or literal.
26    Value,
27
28    /// Left bracket `[`.
29    LeftBracket,
30    /// Right bracket `]`.
31    RightBracket,
32    /// Colon `:`.
33    Colon,
34    /// Semicolon `;`.
35    Semicolon,
36    /// At sign `@`.
37    At,
38    /// Exclamation mark `!`.
39    Bang,
40    /// Dash `-`.
41    Dash,
42    /// Slash `/`.
43    Slash,
44    /// Dot `.`.
45    Dot,
46    /// Hash `#`.
47    Hash,
48    /// Comma `,`.
49    Comma,
50    /// Left parenthesis `(`.
51    LeftParen,
52    /// Right parenthesis `)`.
53    RightParen,
54
55    /// Whitespace.
56    Whitespace,
57    /// Comment.
58    Comment,
59    /// Unknown or error token.
60    Unknown,
61    /// End of stream.
62    Eof,
63}
64
65impl core::fmt::Display for TailwindTokenType {
66    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
67        match self {
68            Self::Root => f.write_str("Root"),
69            Self::Utility => f.write_str("Utility"),
70            Self::Modifier => f.write_str("Modifier"),
71            Self::ArbitraryValue => f.write_str("ArbitraryValue"),
72            Self::Important => f.write_str("Important"),
73            Self::Directive => f.write_str("Directive"),
74            Self::Identifier => f.write_str("Identifier"),
75            Self::Value => f.write_str("Value"),
76            Self::LeftBracket => f.write_str("["),
77            Self::RightBracket => f.write_str("]"),
78            Self::Colon => f.write_str(":"),
79            Self::Semicolon => f.write_str(";"),
80            Self::At => f.write_str("@"),
81            Self::Bang => f.write_str("!"),
82            Self::Dash => f.write_str("-"),
83            Self::Slash => f.write_str("/"),
84            Self::Dot => f.write_str("."),
85            Self::Hash => f.write_str("#"),
86            Self::Comma => f.write_str(","),
87            Self::LeftParen => f.write_str("("),
88            Self::RightParen => f.write_str(")"),
89            Self::Whitespace => f.write_str("Whitespace"),
90            Self::Comment => f.write_str("Comment"),
91            Self::Unknown => f.write_str("Unknown"),
92            Self::Eof => f.write_str("Eof"),
93        }
94    }
95}
96
97impl TokenType for TailwindTokenType {
98    type Role = UniversalTokenRole;
99    const END_OF_STREAM: Self = Self::Eof;
100
101    fn is_ignored(&self) -> bool {
102        matches!(self, Self::Whitespace | Self::Comment)
103    }
104
105    fn role(&self) -> Self::Role {
106        match self {
107            Self::Root => UniversalTokenRole::None,
108            Self::Utility => UniversalTokenRole::Keyword,
109            Self::Modifier => UniversalTokenRole::Keyword,
110            Self::ArbitraryValue => UniversalTokenRole::Literal,
111            Self::Important => UniversalTokenRole::Operator,
112            Self::Directive => UniversalTokenRole::Keyword,
113            Self::Identifier => UniversalTokenRole::Name,
114            Self::Value => UniversalTokenRole::Literal,
115            Self::LeftBracket | Self::RightBracket | Self::LeftParen | Self::RightParen => UniversalTokenRole::Punctuation,
116            Self::Colon | Self::Semicolon | Self::At | Self::Bang | Self::Dash | Self::Slash | Self::Dot | Self::Hash | Self::Comma => UniversalTokenRole::Punctuation,
117            Self::Whitespace => UniversalTokenRole::Whitespace,
118            Self::Comment => UniversalTokenRole::Comment,
119            Self::Eof => UniversalTokenRole::Eof,
120            Self::Unknown => UniversalTokenRole::Error,
121        }
122    }
123}