Skip to main content

oak_nix/parser/
element_type.rs

1use oak_core::{ElementType, UniversalElementRole};
2
3/// Represents the different types of elements and tokens in the Nix language.
4#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
5#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
6pub enum NixElementType {
7    /// Whitespace characters (spaces, tabs).
8    Whitespace,
9    /// Newline characters (\n, \r\n).
10    Newline,
11    /// Comments (single-line # or multi-line /* */).
12    Comment,
13    /// String literals, including interpolated strings.
14    String,
15    /// Numeric literals (integers and floats).
16    Number,
17    /// Boolean literals (true, false).
18    Boolean,
19    /// The `true` keyword.
20    True,
21    /// The `false` keyword.
22    False,
23    /// The `null` keyword.
24    Null,
25    /// Identifiers (variable names, attribute names).
26    Identifier,
27
28    /// The `let` keyword.
29    Let,
30    /// The `in` keyword.
31    In,
32    /// The `if` keyword.
33    If,
34    /// The `then` keyword.
35    Then,
36    /// The `else` keyword.
37    Else,
38    /// The `with` keyword.
39    With,
40    /// The `inherit` keyword.
41    Inherit,
42    /// The `rec` keyword.
43    Rec,
44    /// The `import` keyword.
45    Import,
46    /// The `assert` keyword.
47    Assert,
48    /// The `or` keyword.
49    Or,
50    /// The `and` keyword.
51    And,
52    /// The `not` keyword.
53    Not,
54
55    /// Plus operator (+).
56    Plus,
57    /// Minus operator (-).
58    Minus,
59    /// Star operator (*).
60    Star,
61    /// Slash operator (/).
62    Slash,
63    /// Percent operator (%).
64    Percent,
65    /// Concatenation operator (++).
66    Concatenation,
67    /// Update operator (//).
68    Update,
69    /// Implication operator (->).
70    Implication,
71    /// Equality operator (==).
72    Equal,
73    /// Inequality operator (!=).
74    NotEqual,
75    /// Less than operator (<).
76    Less,
77    /// Greater than operator (>).
78    Greater,
79    /// Less than or equal operator (<=).
80    LessEqual,
81    /// Greater than or equal operator (>=).
82    GreaterEqual,
83    /// Logical AND operator (&&).
84    LogicalAnd,
85    /// Logical OR operator (||).
86    LogicalOr,
87    /// Assignment operator (=).
88    Assign,
89    /// Question mark operator (?).
90    Question,
91
92    /// Left parenthesis (().
93    LeftParen,
94    /// Right parenthesis ()).
95    RightParen,
96    /// Left brace ({).
97    LeftBrace,
98    /// Right brace (}).
99    RightBrace,
100    /// Left bracket ([).
101    LeftBracket,
102    /// Right bracket (]).
103    RightBracket,
104    /// Semicolon (;).
105    Semicolon,
106    /// Colon (:).
107    Colon,
108    /// Comma (,).
109    Comma,
110    /// Dot (.).
111    Dot,
112    /// At symbol (@).
113    At,
114    /// Dollar sign ($).
115    Dollar,
116    /// Hash symbol (#).
117    Hash,
118
119    /// The root element of a Nix file.
120    Root,
121    /// An attribute set expression ({ ... }).
122    Set,
123    /// A list expression ([ ... ]).
124    List,
125    /// A lambda expression (x: ... or { x }: ...).
126    Lambda,
127    /// A let-in expression (let ... in ...).
128    LetIn,
129    /// An if-then-else expression (if ... then ... else ...).
130    IfThenElse,
131    /// An attribute path (a.b.c).
132    AttrPath,
133    /// A binding in a set or let expression (x = y;).
134    Binding,
135
136    /// An error element representing invalid syntax.
137    Error,
138    /// End of file marker.
139    Eof,
140}
141
142impl NixElementType {
143    /// Returns `true` if this element type represents a non-terminal tree node.
144    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    /// Returns `true` if this element type represents a terminal token.
149    pub fn is_token(&self) -> bool {
150        !self.is_element()
151    }
152
153    /// Returns `true` if this element type represents trivia (whitespace or comments).
154    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}