1use serde::{Deserialize, Serialize};
4
5use super::data_refs::{DataDateTimeRef, DataIndex, DataRef};
6use super::literals::{Duration, Literal};
7use super::operators::{BinaryOp, RangeKind, UnaryOp};
8use super::span::{Span, Spanned};
9use super::time::{DateTimeExpr, TimeReference, Timeframe};
10use super::types::TypeAnnotation;
11
12#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
14pub enum ObjectEntry {
15 Field {
17 key: String,
18 value: Expr,
19 type_annotation: Option<TypeAnnotation>,
20 },
21 Spread(Expr),
23}
24
25#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
26pub enum EnumConstructorPayload {
27 Unit,
28 Tuple(Vec<Expr>),
29 Struct(Vec<(String, Expr)>),
30}
31
32#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
33pub enum Expr {
34 Literal(Literal, Span),
36 Identifier(String, Span),
38 DataRef(DataRef, Span),
40 DataDateTimeRef(DataDateTimeRef, Span),
42 DataRelativeAccess {
44 reference: Box<Expr>,
45 index: DataIndex,
46 span: Span,
47 },
48 PropertyAccess {
50 object: Box<Expr>,
51 property: String,
52 optional: bool,
53 span: Span,
54 },
55 IndexAccess {
57 object: Box<Expr>,
58 index: Box<Expr>,
59 end_index: Option<Box<Expr>>,
60 span: Span,
61 },
62 BinaryOp {
64 left: Box<Expr>,
65 op: BinaryOp,
66 right: Box<Expr>,
67 span: Span,
68 },
69 FuzzyComparison {
71 left: Box<Expr>,
72 op: super::operators::FuzzyOp,
73 right: Box<Expr>,
74 tolerance: super::operators::FuzzyTolerance,
75 span: Span,
76 },
77 UnaryOp {
79 op: UnaryOp,
80 operand: Box<Expr>,
81 span: Span,
82 },
83 FunctionCall {
85 name: String,
86 args: Vec<Expr>,
87 named_args: Vec<(String, Expr)>,
88 span: Span,
89 },
90 QualifiedFunctionCall {
92 namespace: String,
93 function: String,
94 args: Vec<Expr>,
95 named_args: Vec<(String, Expr)>,
96 span: Span,
97 },
98 EnumConstructor {
100 enum_name: super::type_path::TypePath,
101 variant: String,
102 payload: EnumConstructorPayload,
103 span: Span,
104 },
105 TimeRef(TimeReference, Span),
107 DateTime(DateTimeExpr, Span),
109 PatternRef(String, Span),
111 Conditional {
113 condition: Box<Expr>,
114 then_expr: Box<Expr>,
115 else_expr: Option<Box<Expr>>,
116 span: Span,
117 },
118 Object(Vec<ObjectEntry>, Span),
120 Array(Vec<Expr>, Span),
122 ListComprehension(Box<super::expr_helpers::ListComprehension>, Span),
124 Block(super::expr_helpers::BlockExpr, Span),
126 TypeAssertion {
128 expr: Box<Expr>,
129 type_annotation: TypeAnnotation,
130 meta_param_overrides: Option<std::collections::HashMap<String, Expr>>,
132 span: Span,
133 },
134 InstanceOf {
136 expr: Box<Expr>,
137 type_annotation: TypeAnnotation,
138 span: Span,
139 },
140 FunctionExpr {
142 params: Vec<super::functions::FunctionParameter>,
143 return_type: Option<TypeAnnotation>,
144 body: Vec<super::statements::Statement>,
145 span: Span,
146 },
147 Duration(Duration, Span),
149 Spread(Box<Expr>, Span),
151
152 If(Box<super::expr_helpers::IfExpr>, Span),
155
156 While(Box<super::expr_helpers::WhileExpr>, Span),
158
159 For(Box<super::expr_helpers::ForExpr>, Span),
161
162 Loop(Box<super::expr_helpers::LoopExpr>, Span),
164
165 Let(Box<super::expr_helpers::LetExpr>, Span),
167
168 Assign(Box<super::expr_helpers::AssignExpr>, Span),
170
171 Break(Option<Box<Expr>>, Span),
173
174 Continue(Span),
176
177 Return(Option<Box<Expr>>, Span),
179
180 MethodCall {
182 receiver: Box<Expr>,
183 method: String,
184 args: Vec<Expr>,
185 named_args: Vec<(String, Expr)>,
186 #[serde(default)]
188 optional: bool,
189 span: Span,
190 },
191
192 Match(Box<super::expr_helpers::MatchExpr>, Span),
194
195 Unit(Span),
197
198 Range {
200 start: Option<Box<Expr>>,
201 end: Option<Box<Expr>>,
202 kind: RangeKind,
203 span: Span,
204 },
205
206 TimeframeContext {
208 timeframe: Timeframe,
209 expr: Box<Expr>,
210 span: Span,
211 },
212
213 TryOperator(Box<Expr>, Span),
215
216 UsingImpl {
218 expr: Box<Expr>,
219 impl_name: String,
220 span: Span,
221 },
222
223 SimulationCall {
225 name: String,
226 params: Vec<(String, Expr)>,
227 span: Span,
228 },
229
230 WindowExpr(Box<super::windows::WindowExpr>, Span),
232
233 FromQuery(Box<super::expr_helpers::FromQueryExpr>, Span),
236
237 StructLiteral {
239 type_name: super::type_path::TypePath,
240 fields: Vec<(String, Expr)>,
241 span: Span,
242 },
243
244 Await(Box<Expr>, Span),
246
247 Join(Box<super::expr_helpers::JoinExpr>, Span),
249
250 Annotated {
255 annotation: super::functions::Annotation,
256 target: Box<Expr>,
257 span: Span,
258 },
259
260 AsyncLet(Box<super::expr_helpers::AsyncLetExpr>, Span),
263
264 AsyncScope(Box<Expr>, Span),
267
268 Comptime(Vec<super::statements::Statement>, Span),
271
272 ComptimeFor(Box<super::expr_helpers::ComptimeForExpr>, Span),
276
277 Reference {
280 expr: Box<Expr>,
281 is_mutable: bool,
283 span: Span,
284 },
285
286 TableRows(Vec<Vec<Expr>>, Span),
290}
291
292impl Expr {
293 pub fn to_json_value(&self) -> serde_json::Value {
295 match self {
296 Expr::Literal(lit, _) => lit.to_json_value(),
297 Expr::Array(elements, _) => {
298 serde_json::Value::Array(elements.iter().map(|e| e.to_json_value()).collect())
299 }
300 Expr::Object(entries, _) => {
301 let mut map = serde_json::Map::new();
302 for entry in entries {
303 if let ObjectEntry::Field { key, value, .. } = entry {
304 map.insert(key.clone(), value.to_json_value());
305 }
306 }
307 serde_json::Value::Object(map)
308 }
309 _ => serde_json::Value::Null, }
311 }
312}
313
314impl Spanned for Expr {
315 fn span(&self) -> Span {
316 match self {
317 Expr::Literal(_, span) => *span,
318 Expr::Identifier(_, span) => *span,
319 Expr::DataRef(_, span) => *span,
320 Expr::DataDateTimeRef(_, span) => *span,
321 Expr::DataRelativeAccess { span, .. } => *span,
322 Expr::PropertyAccess { span, .. } => *span,
323 Expr::IndexAccess { span, .. } => *span,
324 Expr::BinaryOp { span, .. } => *span,
325 Expr::FuzzyComparison { span, .. } => *span,
326 Expr::UnaryOp { span, .. } => *span,
327 Expr::FunctionCall { span, .. } => *span,
328 Expr::QualifiedFunctionCall { span, .. } => *span,
329 Expr::EnumConstructor { span, .. } => *span,
330 Expr::TimeRef(_, span) => *span,
331 Expr::DateTime(_, span) => *span,
332 Expr::PatternRef(_, span) => *span,
333 Expr::Conditional { span, .. } => *span,
334 Expr::Object(_, span) => *span,
335 Expr::Array(_, span) => *span,
336 Expr::ListComprehension(_, span) => *span,
337 Expr::Block(_, span) => *span,
338 Expr::TypeAssertion { span, .. } => *span,
339 Expr::InstanceOf { span, .. } => *span,
340 Expr::FunctionExpr { span, .. } => *span,
341 Expr::Duration(_, span) => *span,
342 Expr::Spread(_, span) => *span,
343 Expr::If(_, span) => *span,
344 Expr::While(_, span) => *span,
345 Expr::For(_, span) => *span,
346 Expr::Loop(_, span) => *span,
347 Expr::Let(_, span) => *span,
348 Expr::Assign(_, span) => *span,
349 Expr::Break(_, span) => *span,
350 Expr::Continue(span) => *span,
351 Expr::Return(_, span) => *span,
352 Expr::MethodCall { span, .. } => *span,
353 Expr::Match(_, span) => *span,
354 Expr::Unit(span) => *span,
355 Expr::Range { span, .. } => *span,
356 Expr::TimeframeContext { span, .. } => *span,
357 Expr::TryOperator(_, span) => *span,
358 Expr::UsingImpl { span, .. } => *span,
359 Expr::SimulationCall { span, .. } => *span,
360 Expr::WindowExpr(_, span) => *span,
361 Expr::FromQuery(_, span) => *span,
362 Expr::StructLiteral { span, .. } => *span,
363 Expr::Await(_, span) => *span,
364 Expr::Join(_, span) => *span,
365 Expr::Annotated { span, .. } => *span,
366 Expr::AsyncLet(_, span) => *span,
367 Expr::AsyncScope(_, span) => *span,
368 Expr::Comptime(_, span) => *span,
369 Expr::ComptimeFor(_, span) => *span,
370 Expr::Reference { span, .. } => *span,
371 Expr::TableRows(_, span) => *span,
372 }
373 }
374}