Skip to main content

oak_tailwind/language/
mod.rs

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