1use oak_core::{Source, Token, TokenType, UniversalElementRole, UniversalTokenRole};
2#[cfg(feature = "serde")]
3use serde::{Deserialize, Serialize};
4
5pub type TailwindToken = Token<TailwindTokenType>;
6
7#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
8#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
9pub enum TailwindTokenType {
10 Root,
11 Document,
12 Template,
13 Block,
14 Variable,
15 Filter,
16 Function,
17 Tag,
18 Comment,
19 Text,
20 Expression,
21 String,
22 Number,
23 Boolean,
24 Null,
25 Array,
26 Object,
27 Identifier,
28 Operator,
29 ErrorNode,
30 LeftBrace,
31 RightBrace,
32 LeftBracket,
33 RightBracket,
34 DoubleLeftBrace,
35 DoubleRightBrace,
36 LeftBracePercent,
37 PercentRightBrace,
38 LeftParen,
39 RightParen,
40 Pipe,
41 Comma,
42 Dot,
43 Colon,
44 Semicolon,
45 Eq,
46 Plus,
47 Minus,
48 Star,
49 Slash,
50 Percent,
51 Bang,
52 Question,
53 Lt,
54 Gt,
55 Amp,
56 Caret,
57 Tilde,
58 Whitespace,
59 Eof,
60 Error,
61}
62
63impl core::fmt::Display for TailwindTokenType {
64 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
65 match self {
66 TailwindTokenType::Root => f.write_str("Root"),
67 TailwindTokenType::Document => f.write_str("Document"),
68 TailwindTokenType::Template => f.write_str("Template"),
69 TailwindTokenType::Block => f.write_str("Block"),
70 TailwindTokenType::Variable => f.write_str("Variable"),
71 TailwindTokenType::Filter => f.write_str("Filter"),
72 TailwindTokenType::Function => f.write_str("Function"),
73 TailwindTokenType::Tag => f.write_str("Tag"),
74 TailwindTokenType::Comment => f.write_str("Comment"),
75 TailwindTokenType::Text => f.write_str("Text"),
76 TailwindTokenType::Expression => f.write_str("Expression"),
77 TailwindTokenType::String => f.write_str("String"),
78 TailwindTokenType::Number => f.write_str("Number"),
79 TailwindTokenType::Boolean => f.write_str("Boolean"),
80 TailwindTokenType::Null => f.write_str("Null"),
81 TailwindTokenType::Array => f.write_str("Array"),
82 TailwindTokenType::Object => f.write_str("Object"),
83 TailwindTokenType::Identifier => f.write_str("Identifier"),
84 TailwindTokenType::Operator => f.write_str("Operator"),
85 TailwindTokenType::ErrorNode => f.write_str("ErrorNode"),
86 TailwindTokenType::LeftBrace => f.write_str("{"),
87 TailwindTokenType::RightBrace => f.write_str("}"),
88 TailwindTokenType::LeftBracket => f.write_str("["),
89 TailwindTokenType::RightBracket => f.write_str("]"),
90 TailwindTokenType::DoubleLeftBrace => f.write_str("{{"),
91 TailwindTokenType::DoubleRightBrace => f.write_str("}}"),
92 TailwindTokenType::LeftBracePercent => f.write_str("{%"),
93 TailwindTokenType::PercentRightBrace => f.write_str("%}"),
94 TailwindTokenType::LeftParen => f.write_str("("),
95 TailwindTokenType::RightParen => f.write_str(")"),
96 TailwindTokenType::Pipe => f.write_str("|"),
97 TailwindTokenType::Comma => f.write_str(","),
98 TailwindTokenType::Dot => f.write_str("."),
99 TailwindTokenType::Colon => f.write_str(":"),
100 TailwindTokenType::Semicolon => f.write_str(";"),
101 TailwindTokenType::Eq => f.write_str("="),
102 TailwindTokenType::Plus => f.write_str("+"),
103 TailwindTokenType::Minus => f.write_str("-"),
104 TailwindTokenType::Star => f.write_str("*"),
105 TailwindTokenType::Slash => f.write_str("/"),
106 TailwindTokenType::Percent => f.write_str("%"),
107 TailwindTokenType::Bang => f.write_str("!"),
108 TailwindTokenType::Question => f.write_str("?"),
109 TailwindTokenType::Lt => f.write_str("<"),
110 TailwindTokenType::Gt => f.write_str(">"),
111 TailwindTokenType::Amp => f.write_str("&"),
112 TailwindTokenType::Caret => f.write_str("^"),
113 TailwindTokenType::Tilde => f.write_str("~"),
114 TailwindTokenType::Whitespace => f.write_str("Whitespace"),
115 TailwindTokenType::Eof => f.write_str("Eof"),
116 TailwindTokenType::Error => f.write_str("Error"),
117 }
118 }
119}
120
121impl TokenType for TailwindTokenType {
122 type Role = UniversalTokenRole;
123 const END_OF_STREAM: Self = Self::Eof;
124
125 fn is_ignored(&self) -> bool {
126 matches!(self, Self::Whitespace | Self::Comment)
127 }
128
129 fn role(&self) -> Self::Role {
130 match self {
131 Self::Whitespace => UniversalTokenRole::Whitespace,
132 Self::Comment => UniversalTokenRole::Comment,
133 Self::Eof => UniversalTokenRole::Eof,
134 Self::Error => UniversalTokenRole::Error,
135 _ => UniversalTokenRole::None,
136 }
137 }
138}