Skip to main content

oak_handlebars/parser/
element_type.rs

1use oak_core::{ElementType, UniversalElementRole};
2
3/// Handlebars element type definition.
4#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
5#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
6pub enum HandlebarsElementType {
7    // --- Tokens ---
8    /// Whitespace.
9    Whitespace,
10    /// Newline.
11    Newline,
12
13    /// Comment.
14    Comment,
15
16    // Handlebars specific tokens
17    /// `{{`.
18    Open,
19    /// `}}`.
20    Close,
21    /// `{{{`.
22    OpenUnescaped,
23    /// `}}}`.
24    CloseUnescaped,
25    /// `{{{{`.
26    OpenRawBlock,
27    /// `}}}}`.
28    CloseRawBlock,
29    /// `{{{{/`.
30    OpenEndRawBlock,
31    /// `{{#`.
32    OpenBlock,
33    /// `{{^`.
34    OpenInverseBlock,
35    /// `{{/`.
36    CloseBlock,
37    /// `{{>`.
38    OpenPartial,
39    /// `{{!`.
40    OpenComment,
41    /// `{{!--`.
42    OpenCommentBlock,
43    /// `--}}`.
44    CloseCommentBlock,
45
46    // Keywords
47    /// `else` keyword.
48    Else,
49
50    // Identifiers and literals
51    /// Identifier.
52    Identifier,
53    /// String literal.
54    StringLiteral,
55    /// Number literal.
56    NumberLiteral,
57    /// Boolean literal.
58    BooleanLiteral,
59    /// `.` symbol.
60    Dot,
61    /// `/` symbol.
62    Slash,
63    /// `#` symbol.
64    Hash,
65    /// `@` symbol.
66    At,
67    /// `|` symbol.
68    Pipe,
69    /// `=` symbol.
70    Equal,
71    /// `(` symbol.
72    LeftParen,
73    /// `)` symbol.
74    RightParen,
75    /// `[` symbol.
76    LeftBracket,
77    /// `]` symbol.
78    RightBracket,
79    /// `^` symbol.
80    Caret,
81
82    // Content
83    /// HTML/text content.
84    Content,
85
86    // --- Elements ---
87    /// Root node.
88    Root,
89    /// Mustache expression.
90    Mustache,
91    /// Block expression.
92    Block,
93    /// Inverse block expression.
94    InverseBlock,
95    /// Partial template reference.
96    Partial,
97    /// Comment node.
98    CommentNode,
99    /// Content node.
100    ContentNode,
101    /// Expression node.
102    Expression,
103    /// Sub-expression node.
104    SubExpression,
105    /// Path node.
106    Path,
107    /// Parameter node.
108    Parameter,
109    /// Else block.
110    ElseBlock,
111
112    // --- Special ---
113    /// Error node.
114    Error,
115    /// End of stream.
116    Eof,
117}
118
119impl ElementType for HandlebarsElementType {
120    type Role = UniversalElementRole;
121
122    fn role(&self) -> Self::Role {
123        match self {
124            Self::Error => UniversalElementRole::Error,
125            _ => UniversalElementRole::None,
126        }
127    }
128}
129
130impl From<crate::lexer::token_type::HandlebarsTokenType> for HandlebarsElementType {
131    fn from(token: crate::lexer::token_type::HandlebarsTokenType) -> Self {
132        unsafe { std::mem::transmute(token) }
133    }
134}