momba_explore/model/
expressions.rs

1//! Data structures for representing expressions.
2
3use serde::{Deserialize, Serialize};
4
5use super::values::*;
6
7/// Represents an expression.
8#[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/// Represents a name expression.
25#[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/// Operators for binary expressions.
54#[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/// Operators for boolean expressions.
77#[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}