dsq_core/ops/
arithmetic_ops.rs1use crate::error::Result;
2use crate::Value;
3
4use super::Operation;
5
6pub 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}