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 And,
120 NaturalAnd,
121 Or,
122 NaturalOr,
123
124 Pipe,
126 Coalesce,
127}
128
129#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
130pub enum UnaryOp {
131 Negate,
132 Not,
133 Invert,
134}
135
136#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
137pub enum PostfixOp {
138 Factorial,
139}