use oak_core::{Token, TokenType, UniversalTokenRole};
pub type TailwindToken = Token<TailwindTokenType>;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum TailwindTokenType {
Root,
Utility,
Modifier,
ArbitraryValue,
Important,
Directive,
Identifier,
Value,
LeftBracket,
RightBracket,
Colon,
Semicolon,
At,
Bang,
Dash,
Slash,
Dot,
Hash,
Comma,
LeftParen,
RightParen,
Whitespace,
Comment,
Unknown,
Eof,
}
impl core::fmt::Display for TailwindTokenType {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
match self {
Self::Root => f.write_str("Root"),
Self::Utility => f.write_str("Utility"),
Self::Modifier => f.write_str("Modifier"),
Self::ArbitraryValue => f.write_str("ArbitraryValue"),
Self::Important => f.write_str("Important"),
Self::Directive => f.write_str("Directive"),
Self::Identifier => f.write_str("Identifier"),
Self::Value => f.write_str("Value"),
Self::LeftBracket => f.write_str("["),
Self::RightBracket => f.write_str("]"),
Self::Colon => f.write_str(":"),
Self::Semicolon => f.write_str(";"),
Self::At => f.write_str("@"),
Self::Bang => f.write_str("!"),
Self::Dash => f.write_str("-"),
Self::Slash => f.write_str("/"),
Self::Dot => f.write_str("."),
Self::Hash => f.write_str("#"),
Self::Comma => f.write_str(","),
Self::LeftParen => f.write_str("("),
Self::RightParen => f.write_str(")"),
Self::Whitespace => f.write_str("Whitespace"),
Self::Comment => f.write_str("Comment"),
Self::Unknown => f.write_str("Unknown"),
Self::Eof => f.write_str("Eof"),
}
}
}
impl TokenType for TailwindTokenType {
type Role = UniversalTokenRole;
const END_OF_STREAM: Self = Self::Eof;
fn is_ignored(&self) -> bool {
matches!(self, Self::Whitespace | Self::Comment)
}
fn role(&self) -> Self::Role {
match self {
Self::Root => UniversalTokenRole::None,
Self::Utility => UniversalTokenRole::Keyword,
Self::Modifier => UniversalTokenRole::Keyword,
Self::ArbitraryValue => UniversalTokenRole::Literal,
Self::Important => UniversalTokenRole::Operator,
Self::Directive => UniversalTokenRole::Keyword,
Self::Identifier => UniversalTokenRole::Name,
Self::Value => UniversalTokenRole::Literal,
Self::LeftBracket | Self::RightBracket | Self::LeftParen | Self::RightParen => UniversalTokenRole::Punctuation,
Self::Colon | Self::Semicolon | Self::At | Self::Bang | Self::Dash | Self::Slash | Self::Dot | Self::Hash | Self::Comma => UniversalTokenRole::Punctuation,
Self::Whitespace => UniversalTokenRole::Whitespace,
Self::Comment => UniversalTokenRole::Comment,
Self::Eof => UniversalTokenRole::Eof,
Self::Unknown => UniversalTokenRole::Error,
}
}
}