1use serde::{Deserialize, Serialize};
4
5use super::values::*;
6
7#[derive(Serialize, Deserialize, Eq, PartialEq, Hash, Clone, Debug)]
9#[serde(rename_all = "SCREAMING_SNAKE_CASE", tag = "kind")]
10pub enum Expression {
11 Name(NameExpression),
12 Constant(ConstantExpression),
13 Unary(UnaryExpression),
14 Binary(BinaryExpression),
15 Boolean(BooleanExpression),
16 Comparison(ComparisonExpression),
17 Conditional(ConditionalExpression),
18 Trigonometric(TrigonometricExpression),
19 Index(IndexExpression),
20 Comprehension(ComprehensionExpression),
21 Vector(VectorExpression),
22}
23
24#[derive(Serialize, Deserialize, Eq, PartialEq, Hash, Clone, Debug)]
26pub struct NameExpression {
27 pub identifier: String,
28}
29
30#[derive(Serialize, Deserialize, Eq, PartialEq, Hash, Clone, Debug)]
31pub struct ConstantExpression {
32 pub value: Value,
33}
34
35#[derive(Serialize, Deserialize, Eq, PartialEq, Hash, Clone, Debug)]
36#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
37pub enum UnaryOperator {
38 Not,
39 Minus,
40 Floor,
41 Ceil,
42 Abs,
43 Sgn,
44 Trc,
45}
46
47#[derive(Serialize, Deserialize, Eq, PartialEq, Hash, Clone, Debug)]
48pub struct UnaryExpression {
49 pub operator: UnaryOperator,
50 pub operand: Box<Expression>,
51}
52
53#[derive(Serialize, Deserialize, Eq, PartialEq, Hash, Clone, Debug)]
55#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
56pub enum BinaryOperator {
57 Add,
58 Sub,
59 Mul,
60 FloorDiv,
61 RealDiv,
62 Mod,
63 Pow,
64 Log,
65 Min,
66 Max,
67}
68
69#[derive(Serialize, Deserialize, Eq, PartialEq, Hash, Clone, Debug)]
70pub struct BinaryExpression {
71 pub operator: BinaryOperator,
72 pub left: Box<Expression>,
73 pub right: Box<Expression>,
74}
75
76#[derive(Serialize, Deserialize, Eq, PartialEq, Hash, Clone, Debug)]
78#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
79pub enum BooleanOperator {
80 And,
81 Or,
82}
83
84#[derive(Serialize, Deserialize, Eq, PartialEq, Hash, Clone, Debug)]
85pub struct BooleanExpression {
86 pub operator: BooleanOperator,
87 pub operands: Vec<Expression>,
88}
89
90#[derive(Serialize, Deserialize, Eq, PartialEq, Hash, Clone, Debug)]
91#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
92pub enum ComparisonOperator {
93 Eq,
94 Ne,
95 Lt,
96 Le,
97 Ge,
98 Gt,
99}
100
101#[derive(Serialize, Deserialize, Eq, PartialEq, Hash, Clone, Debug)]
102pub struct ComparisonExpression {
103 pub operator: ComparisonOperator,
104 pub left: Box<Expression>,
105 pub right: Box<Expression>,
106}
107
108#[derive(Serialize, Deserialize, Eq, PartialEq, Hash, Clone, Debug)]
109pub struct ConditionalExpression {
110 pub condition: Box<Expression>,
111 pub consequence: Box<Expression>,
112 pub alternative: Box<Expression>,
113}
114
115#[derive(Serialize, Deserialize, Eq, PartialEq, Hash, Clone, Debug)]
116#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
117pub enum TrigonometricFunction {
118 Sin,
119 Cos,
120 Tan,
121 Cot,
122 Sec,
123 Csc,
124 ArcSin,
125 ArcCos,
126 ArcTan,
127 ArcCot,
128 ArcSec,
129 ArcCsc,
130}
131
132#[derive(Serialize, Deserialize, Eq, PartialEq, Hash, Clone, Debug)]
133pub struct TrigonometricExpression {
134 pub function: TrigonometricFunction,
135 pub operand: Box<Expression>,
136}
137
138#[derive(Serialize, Deserialize, Eq, PartialEq, Hash, Clone, Debug)]
139pub struct IndexExpression {
140 pub vector: Box<Expression>,
141 pub index: Box<Expression>,
142}
143
144#[derive(Serialize, Deserialize, Eq, PartialEq, Hash, Clone, Debug)]
145pub struct ComprehensionExpression {
146 pub variable: String,
147 pub length: Box<Expression>,
148 pub element: Box<Expression>,
149}
150
151#[derive(Serialize, Deserialize, Eq, PartialEq, Hash, Clone, Debug)]
152pub struct VectorExpression {
153 pub elements: Vec<Expression>,
154}