Skip to main content

oak_twig/parser/
element_type.rs

1use oak_core::{ElementType, Parser, UniversalElementRole};
2
3/// Element types for the Twig parser.
4#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
5#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
6/// Element types for Twig syntax nodes.
7pub enum TwigElementType {
8    /// The root node of the parse tree.
9    Root,
10    /// A document node.
11    Document,
12    /// A template node.
13    Template,
14    /// A block node (`{% block %}`).
15    Block,
16    /// A variable node (`{{ var }}`).
17    Variable,
18    /// A filter node (`| filter`).
19    Filter,
20    /// A function node (`func()`).
21    Function,
22    /// A tag node (`{% tag %}`).
23    Tag,
24    /// A comment node (`{# comment #}`).
25    Comment,
26    /// Plain text content.
27    Text,
28    /// An expression node.
29    Expression,
30
31    /// An if statement node (`{% if %}`).
32    IfStatement,
33    /// A for statement node (`{% for %}`).
34    ForStatement,
35    /// A macro definition node (`{% macro %}`).
36    MacroDefinition,
37
38    /// A generic literal.
39    Literal,
40
41    /// A string literal.
42    String,
43    /// A numeric literal.
44    Number,
45    /// A boolean literal.
46    Boolean,
47    /// A null literal.
48    Null,
49    /// An array literal.
50    Array,
51    /// An object literal.
52    Object,
53    /// An identifier.
54    Identifier,
55    /// An operator.
56    Operator,
57    /// An error node in the parse tree.
58    ErrorNode,
59
60    /// An opening brace (`{`).
61    LeftBrace,
62    /// A closing brace (`}`).
63    RightBrace,
64    /// An opening bracket (`[`).
65    LeftBracket,
66    /// A closing bracket (`]`).
67    RightBracket,
68    /// Double opening braces (`{{`).
69    DoubleLeftBrace,
70    /// Double closing braces (`}}`).
71    DoubleRightBrace,
72    /// Opening brace and percent (`{%`).
73    LeftBracePercent,
74    /// Percent and closing brace (`%}`).
75    PercentRightBrace,
76    /// An opening parenthesis (`(`).
77    LeftParen,
78    /// A closing parenthesis (`)`).
79    RightParen,
80    /// A pipe character (`|`).
81    Pipe,
82    /// A comma (`,`).
83    Comma,
84    /// A dot character (`.`).
85    Dot,
86    /// A colon character (`:`).
87    Colon,
88    /// A semicolon character (`;`).
89    Semicolon,
90    /// An equal sign (`=`).
91    Eq,
92    /// A plus sign (`+`).
93    Plus,
94    /// A minus sign (`-`).
95    Minus,
96    /// A star sign (`*`).
97    Star,
98    /// A slash sign (`/`).
99    Slash,
100    /// A percent sign (`%`).
101    Percent,
102    /// An exclamation mark (`!`).
103    Bang,
104    /// A question mark (`?`).
105    Question,
106    /// A less-than sign (`<`).
107    Lt,
108    /// A greater-than sign (`>`).
109    Gt,
110    /// An ampersand character (`&`).
111    Amp,
112    /// A caret character (`^`).
113    Caret,
114    /// A tilde character (`~`).
115    Tilde,
116    /// Whitespace characters.
117    Whitespace,
118    /// End of stream.
119    Eof,
120    /// An error element.
121    Error,
122}
123
124impl oak_core::TokenType for TwigElementType {
125    type Role = oak_core::UniversalTokenRole;
126    const END_OF_STREAM: Self = TwigElementType::Eof;
127
128    fn role(&self) -> Self::Role {
129        match self {
130            Self::Whitespace => oak_core::UniversalTokenRole::Whitespace,
131            Self::Comment => oak_core::UniversalTokenRole::Comment,
132            _ => oak_core::UniversalTokenRole::None,
133        }
134    }
135}
136
137impl core::fmt::Display for TwigElementType {
138    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
139        match self {
140            TwigElementType::Root => f.write_str("Root"),
141            TwigElementType::Document => f.write_str("Document"),
142            TwigElementType::Template => f.write_str("Template"),
143            TwigElementType::Block => f.write_str("Block"),
144            TwigElementType::Variable => f.write_str("Variable"),
145            TwigElementType::Filter => f.write_str("Filter"),
146            TwigElementType::Function => f.write_str("Function"),
147            TwigElementType::Tag => f.write_str("Tag"),
148            TwigElementType::Comment => f.write_str("Comment"),
149            TwigElementType::Text => f.write_str("Text"),
150            TwigElementType::Expression => f.write_str("Expression"),
151            TwigElementType::IfStatement => f.write_str("IfStatement"),
152            TwigElementType::ForStatement => f.write_str("ForStatement"),
153            TwigElementType::MacroDefinition => f.write_str("MacroDefinition"),
154            TwigElementType::Literal => f.write_str("Literal"),
155            TwigElementType::String => f.write_str("String"),
156            TwigElementType::Number => f.write_str("Number"),
157            TwigElementType::Boolean => f.write_str("Boolean"),
158            TwigElementType::Null => f.write_str("Null"),
159            TwigElementType::Array => f.write_str("Array"),
160            TwigElementType::Object => f.write_str("Object"),
161            TwigElementType::Identifier => f.write_str("Identifier"),
162            TwigElementType::Operator => f.write_str("Operator"),
163            TwigElementType::ErrorNode => f.write_str("ErrorNode"),
164            TwigElementType::LeftBrace => f.write_str("{"),
165            TwigElementType::RightBrace => f.write_str("}"),
166            TwigElementType::LeftBracket => f.write_str("["),
167            TwigElementType::RightBracket => f.write_str("]"),
168            TwigElementType::DoubleLeftBrace => f.write_str("{{"),
169            TwigElementType::DoubleRightBrace => f.write_str("}}"),
170            TwigElementType::LeftBracePercent => f.write_str("{%"),
171            TwigElementType::PercentRightBrace => f.write_str("%}"),
172            TwigElementType::LeftParen => f.write_str("("),
173            TwigElementType::RightParen => f.write_str(")"),
174            TwigElementType::Pipe => f.write_str("|"),
175            TwigElementType::Comma => f.write_str(","),
176            TwigElementType::Dot => f.write_str("."),
177            TwigElementType::Colon => f.write_str(":"),
178            TwigElementType::Semicolon => f.write_str(";"),
179            TwigElementType::Eq => f.write_str("="),
180            TwigElementType::Plus => f.write_str("+"),
181            TwigElementType::Minus => f.write_str("-"),
182            TwigElementType::Star => f.write_str("*"),
183            TwigElementType::Slash => f.write_str("/"),
184            TwigElementType::Percent => f.write_str("%"),
185            TwigElementType::Bang => f.write_str("!"),
186            TwigElementType::Question => f.write_str("?"),
187            TwigElementType::Lt => f.write_str("<"),
188            TwigElementType::Gt => f.write_str(">"),
189            TwigElementType::Amp => f.write_str("&"),
190            TwigElementType::Caret => f.write_str("^"),
191            TwigElementType::Tilde => f.write_str("~"),
192            TwigElementType::Whitespace => f.write_str("Whitespace"),
193            TwigElementType::Eof => f.write_str("EOF"),
194            TwigElementType::Error => f.write_str("Error"),
195        }
196    }
197}
198
199impl ElementType for TwigElementType {
200    type Role = UniversalElementRole;
201
202    fn role(&self) -> Self::Role {
203        match self {
204            _ => UniversalElementRole::None,
205        }
206    }
207}
208
209impl From<crate::lexer::token_type::TwigTokenType> for TwigElementType {
210    fn from(token: crate::lexer::token_type::TwigTokenType) -> Self {
211        unsafe { std::mem::transmute(token) }
212    }
213}