Skip to main content

oak_tailwind/language/
mod.rs

1#![doc = include_str!("readme.md")]
2use crate::{ast::TailwindRoot, lexer::TailwindLexer, parser::TailwindParser};
3use oak_core::{Language, LanguageCategory};
4
5/// Tailwind engine configuration modes.
6#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
7#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8pub enum TailwindMode {
9    /// Template mode (e.g., HTML with Tailwind classes).
10    #[default]
11    Template,
12    /// Expression mode (e.g., inside a template tag).
13    Expression,
14}
15
16/// Tailwind language definition.
17#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
18#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
19pub struct TailwindLanguage {
20    /// The current mode of the engine.
21    pub mode: TailwindMode,
22}
23
24impl Language for TailwindLanguage {
25    const NAME: &'static str = "tailwind";
26    const CATEGORY: LanguageCategory = LanguageCategory::StyleSheet;
27
28    type TokenType = crate::lexer::token_type::TailwindTokenType;
29    type ElementType = crate::parser::element_type::TailwindElementType;
30    type TypedRoot = TailwindRoot;
31}
32
33impl TailwindLanguage {
34    /// Creates a new `TailwindLanguage` with standard settings.
35    pub fn new() -> Self {
36        Self::standard()
37    }
38
39    /// Creates a new `TailwindLanguage` with standard settings.
40    pub fn standard() -> Self {
41        Self { mode: TailwindMode::Template }
42    }
43
44    /// Creates a new lexer for this language configuration.
45    pub fn lexer(&self) -> TailwindLexer {
46        TailwindLexer::new(*self)
47    }
48
49    /// Creates a new parser for this language configuration.
50    pub fn parser(&self) -> TailwindParser {
51        TailwindParser::new(*self)
52    }
53}