1use oak_core::{ElementType, UniversalElementRole};
2
3#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
5#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
6pub enum NixElementType {
7 Whitespace,
9 Newline,
11 Comment,
13 String,
15 Number,
17 Boolean,
19 True,
21 False,
23 Null,
25 Identifier,
27
28 Let,
30 In,
32 If,
34 Then,
36 Else,
38 With,
40 Inherit,
42 Rec,
44 Import,
46 Assert,
48 Or,
50 And,
52 Not,
54
55 Plus,
57 Minus,
59 Star,
61 Slash,
63 Percent,
65 Concatenation,
67 Update,
69 Implication,
71 Equal,
73 NotEqual,
75 Less,
77 Greater,
79 LessEqual,
81 GreaterEqual,
83 LogicalAnd,
85 LogicalOr,
87 Assign,
89 Question,
91
92 LeftParen,
94 RightParen,
96 LeftBrace,
98 RightBrace,
100 LeftBracket,
102 RightBracket,
104 Semicolon,
106 Colon,
108 Comma,
110 Dot,
112 At,
114 Dollar,
116 Hash,
118
119 Root,
121 Set,
123 List,
125 Lambda,
127 LetIn,
129 IfThenElse,
131 AttrPath,
133 Binding,
135
136 Error,
138 Eof,
140}
141
142impl NixElementType {
143 pub fn is_element(&self) -> bool {
145 matches!(self, Self::Root | Self::Set | Self::List | Self::Lambda | Self::LetIn | Self::IfThenElse | Self::AttrPath | Self::Binding)
146 }
147
148 pub fn is_token(&self) -> bool {
150 !self.is_element()
151 }
152
153 pub fn is_trivia(&self) -> bool {
155 matches!(self, Self::Whitespace | Self::Newline | Self::Comment)
156 }
157}
158
159impl ElementType for NixElementType {
160 type Role = UniversalElementRole;
161
162 fn role(&self) -> Self::Role {
163 match self {
164 _ => UniversalElementRole::None,
165 }
166 }
167}
168
169impl From<crate::lexer::token_type::NixTokenType> for NixElementType {
170 fn from(token: crate::lexer::token_type::NixTokenType) -> Self {
171 match token {
172 crate::lexer::token_type::NixTokenType::Whitespace => NixElementType::Whitespace,
173 crate::lexer::token_type::NixTokenType::Newline => NixElementType::Newline,
174 crate::lexer::token_type::NixTokenType::Comment => NixElementType::Comment,
175 crate::lexer::token_type::NixTokenType::String => NixElementType::String,
176 crate::lexer::token_type::NixTokenType::Number => NixElementType::Number,
177 crate::lexer::token_type::NixTokenType::Boolean => NixElementType::Boolean,
178 crate::lexer::token_type::NixTokenType::True => NixElementType::True,
179 crate::lexer::token_type::NixTokenType::False => NixElementType::False,
180 crate::lexer::token_type::NixTokenType::Null => NixElementType::Null,
181 crate::lexer::token_type::NixTokenType::Identifier => NixElementType::Identifier,
182 crate::lexer::token_type::NixTokenType::Let => NixElementType::Let,
183 crate::lexer::token_type::NixTokenType::In => NixElementType::In,
184 crate::lexer::token_type::NixTokenType::If => NixElementType::If,
185 crate::lexer::token_type::NixTokenType::Then => NixElementType::Then,
186 crate::lexer::token_type::NixTokenType::Else => NixElementType::Else,
187 crate::lexer::token_type::NixTokenType::With => NixElementType::With,
188 crate::lexer::token_type::NixTokenType::Inherit => NixElementType::Inherit,
189 crate::lexer::token_type::NixTokenType::Rec => NixElementType::Rec,
190 crate::lexer::token_type::NixTokenType::Import => NixElementType::Import,
191 crate::lexer::token_type::NixTokenType::Assert => NixElementType::Assert,
192 crate::lexer::token_type::NixTokenType::Or => NixElementType::Or,
193 crate::lexer::token_type::NixTokenType::And => NixElementType::And,
194 crate::lexer::token_type::NixTokenType::Not => NixElementType::Not,
195 crate::lexer::token_type::NixTokenType::Plus => NixElementType::Plus,
196 crate::lexer::token_type::NixTokenType::Minus => NixElementType::Minus,
197 crate::lexer::token_type::NixTokenType::Star => NixElementType::Star,
198 crate::lexer::token_type::NixTokenType::Slash => NixElementType::Slash,
199 crate::lexer::token_type::NixTokenType::Percent => NixElementType::Percent,
200 crate::lexer::token_type::NixTokenType::Concatenation => NixElementType::Concatenation,
201 crate::lexer::token_type::NixTokenType::Update => NixElementType::Update,
202 crate::lexer::token_type::NixTokenType::Implication => NixElementType::Implication,
203 crate::lexer::token_type::NixTokenType::Equal => NixElementType::Equal,
204 crate::lexer::token_type::NixTokenType::NotEqual => NixElementType::NotEqual,
205 crate::lexer::token_type::NixTokenType::Less => NixElementType::Less,
206 crate::lexer::token_type::NixTokenType::Greater => NixElementType::Greater,
207 crate::lexer::token_type::NixTokenType::LessEqual => NixElementType::LessEqual,
208 crate::lexer::token_type::NixTokenType::GreaterEqual => NixElementType::GreaterEqual,
209 crate::lexer::token_type::NixTokenType::LogicalAnd => NixElementType::LogicalAnd,
210 crate::lexer::token_type::NixTokenType::LogicalOr => NixElementType::LogicalOr,
211 crate::lexer::token_type::NixTokenType::Assign => NixElementType::Assign,
212 crate::lexer::token_type::NixTokenType::Question => NixElementType::Question,
213 crate::lexer::token_type::NixTokenType::LeftParen => NixElementType::LeftParen,
214 crate::lexer::token_type::NixTokenType::RightParen => NixElementType::RightParen,
215 crate::lexer::token_type::NixTokenType::LeftBrace => NixElementType::LeftBrace,
216 crate::lexer::token_type::NixTokenType::RightBrace => NixElementType::RightBrace,
217 crate::lexer::token_type::NixTokenType::LeftBracket => NixElementType::LeftBracket,
218 crate::lexer::token_type::NixTokenType::RightBracket => NixElementType::RightBracket,
219 crate::lexer::token_type::NixTokenType::Semicolon => NixElementType::Semicolon,
220 crate::lexer::token_type::NixTokenType::Colon => NixElementType::Colon,
221 crate::lexer::token_type::NixTokenType::Comma => NixElementType::Comma,
222 crate::lexer::token_type::NixTokenType::Dot => NixElementType::Dot,
223 crate::lexer::token_type::NixTokenType::At => NixElementType::At,
224 crate::lexer::token_type::NixTokenType::Dollar => NixElementType::Dollar,
225 crate::lexer::token_type::NixTokenType::Hash => NixElementType::Hash,
226 crate::lexer::token_type::NixTokenType::Root => NixElementType::Root,
227 crate::lexer::token_type::NixTokenType::Set => NixElementType::Set,
228 crate::lexer::token_type::NixTokenType::List => NixElementType::List,
229 crate::lexer::token_type::NixTokenType::Lambda => NixElementType::Lambda,
230 crate::lexer::token_type::NixTokenType::LetIn => NixElementType::LetIn,
231 crate::lexer::token_type::NixTokenType::IfThenElse => NixElementType::IfThenElse,
232 crate::lexer::token_type::NixTokenType::AttrPath => NixElementType::AttrPath,
233 crate::lexer::token_type::NixTokenType::Binding => NixElementType::Binding,
234 crate::lexer::token_type::NixTokenType::Error => NixElementType::Error,
235 crate::lexer::token_type::NixTokenType::Eof => NixElementType::Eof,
236 }
237 }
238}