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}