datalogic_rs/builder/
comparison_builder.rs1use crate::arena::DataArena;
2use crate::logic::ComparisonOp;
3use crate::logic::{Logic, OperatorType};
4
5pub struct ComparisonBuilder<'a> {
10 arena: &'a DataArena,
12}
13
14impl<'a> ComparisonBuilder<'a> {
15 pub fn new(arena: &'a DataArena) -> Self {
17 Self { arena }
18 }
19
20 pub fn equal_op(&self) -> ComparisonOperationBuilder<'a> {
22 ComparisonOperationBuilder::new(self.arena, ComparisonOp::Equal)
23 }
24
25 pub fn strict_equal_op(&self) -> ComparisonOperationBuilder<'a> {
27 ComparisonOperationBuilder::new(self.arena, ComparisonOp::StrictEqual)
28 }
29
30 pub fn not_equal_op(&self) -> ComparisonOperationBuilder<'a> {
32 ComparisonOperationBuilder::new(self.arena, ComparisonOp::NotEqual)
33 }
34
35 pub fn strict_not_equal_op(&self) -> ComparisonOperationBuilder<'a> {
37 ComparisonOperationBuilder::new(self.arena, ComparisonOp::StrictNotEqual)
38 }
39
40 pub fn greater_than_op(&self) -> ComparisonOperationBuilder<'a> {
42 ComparisonOperationBuilder::new(self.arena, ComparisonOp::GreaterThan)
43 }
44
45 pub fn greater_than_or_equal_op(&self) -> ComparisonOperationBuilder<'a> {
47 ComparisonOperationBuilder::new(self.arena, ComparisonOp::GreaterThanOrEqual)
48 }
49
50 pub fn less_than_op(&self) -> ComparisonOperationBuilder<'a> {
52 ComparisonOperationBuilder::new(self.arena, ComparisonOp::LessThan)
53 }
54
55 pub fn less_than_or_equal_op(&self) -> ComparisonOperationBuilder<'a> {
57 ComparisonOperationBuilder::new(self.arena, ComparisonOp::LessThanOrEqual)
58 }
59}
60
61pub struct ComparisonOperationBuilder<'a> {
63 arena: &'a DataArena,
65 operation: ComparisonOp,
67 operands: Vec<Logic<'a>>,
69}
70
71impl<'a> ComparisonOperationBuilder<'a> {
72 pub fn new(arena: &'a DataArena, operation: ComparisonOp) -> Self {
74 Self {
75 arena,
76 operation,
77 operands: Vec::new(),
78 }
79 }
80
81 pub fn operand(mut self, value: Logic<'a>) -> Self {
83 self.operands.push(value);
84 self
85 }
86
87 pub fn var(self, path: &str) -> Self {
89 let var = Logic::variable(path, None, self.arena);
90 self.operand(var)
91 }
92
93 pub fn value<T: Into<crate::value::DataValue<'a>>>(mut self, value: T) -> Self {
95 let val = Logic::literal(value.into(), self.arena);
96 self.operands.push(val);
97 self
98 }
99
100 pub fn int(mut self, value: i64) -> Self {
102 let val = Logic::literal(crate::value::DataValue::integer(value), self.arena);
103 self.operands.push(val);
104 self
105 }
106
107 pub fn float(mut self, value: f64) -> Self {
109 let val = Logic::literal(crate::value::DataValue::float(value), self.arena);
110 self.operands.push(val);
111 self
112 }
113
114 pub fn string(mut self, value: &str) -> Self {
116 let val = Logic::literal(
117 crate::value::DataValue::string(self.arena, value),
118 self.arena,
119 );
120 self.operands.push(val);
121 self
122 }
123
124 pub fn bool(mut self, value: bool) -> Self {
126 let val = Logic::literal(crate::value::DataValue::bool(value), self.arena);
127 self.operands.push(val);
128 self
129 }
130
131 pub fn build(self) -> Logic<'a> {
136 let mut final_operands = self.operands;
137
138 if final_operands.is_empty() {
140 final_operands.push(Logic::literal(crate::value::DataValue::null(), self.arena));
141 }
142
143 if final_operands.len() == 1 {
145 final_operands.push(Logic::literal(
146 crate::value::DataValue::bool(true),
147 self.arena,
148 ));
149 }
150
151 Logic::operator(
152 OperatorType::Comparison(self.operation),
153 final_operands,
154 self.arena,
155 )
156 }
157}