1use crate::functions::BuiltInFunction;
2use crate::values::LambdaArg;
3use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
6pub enum Expr {
7 Number(f64),
9 String(String),
10 Bool(bool),
11 Null,
12
13 Identifier(String),
15 BuiltIn(BuiltInFunction), List(Vec<Expr>),
19 Record(Vec<RecordEntry>),
20
21 Lambda {
23 args: Vec<LambdaArg>,
24 body: Box<Expr>,
25 },
26
27 Conditional {
29 condition: Box<Expr>,
30 then_expr: Box<Expr>,
31 else_expr: Box<Expr>,
32 },
33
34 DoBlock {
35 statements: Vec<DoStatement>,
36 return_expr: Box<Expr>,
37 },
38
39 Assignment {
41 ident: String,
42 value: Box<Expr>,
43 },
44
45 Call {
46 func: Box<Expr>,
47 args: Vec<Expr>,
48 },
49
50 Access {
51 expr: Box<Expr>,
52 index: Box<Expr>,
53 },
54
55 DotAccess {
56 expr: Box<Expr>,
57 field: String,
58 },
59
60 BinaryOp {
61 op: BinaryOp,
62 left: Box<Expr>,
63 right: Box<Expr>,
64 },
65
66 UnaryOp {
67 op: UnaryOp,
68 expr: Box<Expr>,
69 },
70
71 PostfixOp {
72 op: PostfixOp,
73 expr: Box<Expr>,
74 },
75
76 Spread(Box<Expr>),
78}
79
80#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
81pub struct RecordEntry {
82 pub key: RecordKey,
83 pub value: Expr,
84}
85
86#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
87pub enum RecordKey {
88 Static(String),
89 Dynamic(Box<Expr>),
90 Shorthand(String),
91 Spread(Box<Expr>),
92}
93
94#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
95pub enum DoStatement {
96 Expression(Expr),
97 Comment(String),
98}
99
100#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
101pub enum BinaryOp {
102 Add,
104 Subtract,
105 Multiply,
106 Divide,
107 Modulo,
108 Power,
109
110 Equal,
112 NotEqual,
113 Less,
114 LessEq,
115 Greater,
116 GreaterEq,
117
118 DotEqual,
120 DotNotEqual,
121 DotLess,
122 DotLessEq,
123 DotGreater,
124 DotGreaterEq,
125
126 And,
128 NaturalAnd,
129 Or,
130 NaturalOr,
131
132 Via,
134 Into,
135 Coalesce,
136}
137
138#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
139pub enum UnaryOp {
140 Negate,
141 Not,
142 Invert,
143}
144
145#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
146pub enum PostfixOp {
147 Factorial,
148}