Skip to main content

oak_handlebars/parser/
element_type.rs

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