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}