dsq_core/ops/
arithmetic_ops.rs

1use crate::error::Result;
2use crate::Value;
3
4use super::Operation;
5
6/// Binary operations
7pub struct AddOperation {
8    pub left_ops: Vec<Box<dyn Operation + Send + Sync>>,
9    pub right_ops: Vec<Box<dyn Operation + Send + Sync>>,
10}
11
12impl AddOperation {
13    #[must_use]
14    pub fn new(
15        left_ops: Vec<Box<dyn Operation + Send + Sync>>,
16        right_ops: Vec<Box<dyn Operation + Send + Sync>>,
17    ) -> Self {
18        Self {
19            left_ops,
20            right_ops,
21        }
22    }
23}
24
25impl Operation for AddOperation {
26    fn apply(&self, value: &Value) -> Result<Value> {
27        let mut left_val = value.clone();
28        for op in &self.left_ops {
29            left_val = op.apply(&left_val)?;
30        }
31
32        let mut right_val = value.clone();
33        for op in &self.right_ops {
34            right_val = op.apply(&right_val)?;
35        }
36
37        Ok(dsq_shared::ops::add_values(&left_val, &right_val)?)
38    }
39
40    fn description(&self) -> String {
41        "add".to_string()
42    }
43}
44
45pub struct SubOperation {
46    pub left_ops: Vec<Box<dyn Operation + Send + Sync>>,
47    pub right_ops: Vec<Box<dyn Operation + Send + Sync>>,
48}
49
50impl SubOperation {
51    #[must_use]
52    pub fn new(
53        left_ops: Vec<Box<dyn Operation + Send + Sync>>,
54        right_ops: Vec<Box<dyn Operation + Send + Sync>>,
55    ) -> Self {
56        Self {
57            left_ops,
58            right_ops,
59        }
60    }
61}
62
63impl Operation for SubOperation {
64    fn apply(&self, value: &Value) -> Result<Value> {
65        let mut left_val = value.clone();
66        for op in &self.left_ops {
67            left_val = op.apply(&left_val)?;
68        }
69
70        let mut right_val = value.clone();
71        for op in &self.right_ops {
72            right_val = op.apply(&right_val)?;
73        }
74
75        Ok(dsq_shared::ops::sub_values(&left_val, &right_val)?)
76    }
77
78    fn description(&self) -> String {
79        "subtract".to_string()
80    }
81}
82
83pub struct MulOperation {
84    pub left_ops: Vec<Box<dyn Operation + Send + Sync>>,
85    pub right_ops: Vec<Box<dyn Operation + Send + Sync>>,
86}
87
88impl MulOperation {
89    #[must_use]
90    pub fn new(
91        left_ops: Vec<Box<dyn Operation + Send + Sync>>,
92        right_ops: Vec<Box<dyn Operation + Send + Sync>>,
93    ) -> Self {
94        Self {
95            left_ops,
96            right_ops,
97        }
98    }
99}
100
101impl Operation for MulOperation {
102    fn apply(&self, value: &Value) -> Result<Value> {
103        let mut left_val = value.clone();
104        for op in &self.left_ops {
105            left_val = op.apply(&left_val)?;
106        }
107
108        let mut right_val = value.clone();
109        for op in &self.right_ops {
110            right_val = op.apply(&right_val)?;
111        }
112
113        Ok(dsq_shared::ops::mul_values(&left_val, &right_val)?)
114    }
115
116    fn description(&self) -> String {
117        "multiply".to_string()
118    }
119}
120
121pub struct DivOperation {
122    pub left_ops: Vec<Box<dyn Operation + Send + Sync>>,
123    pub right_ops: Vec<Box<dyn Operation + Send + Sync>>,
124}
125
126impl DivOperation {
127    #[must_use]
128    pub fn new(
129        left_ops: Vec<Box<dyn Operation + Send + Sync>>,
130        right_ops: Vec<Box<dyn Operation + Send + Sync>>,
131    ) -> Self {
132        Self {
133            left_ops,
134            right_ops,
135        }
136    }
137}
138
139impl Operation for DivOperation {
140    fn apply(&self, value: &Value) -> Result<Value> {
141        let mut left_val = value.clone();
142        for op in &self.left_ops {
143            left_val = op.apply(&left_val)?;
144        }
145
146        let mut right_val = value.clone();
147        for op in &self.right_ops {
148            right_val = op.apply(&right_val)?;
149        }
150
151        Ok(dsq_shared::ops::div_values(&left_val, &right_val)?)
152    }
153
154    fn description(&self) -> String {
155        "divide".to_string()
156    }
157}