square_ox/builder/
implementations.rs

1use super::*;
2use crate::objects::{TimeRange, DeviceCheckoutOptions, Money, Order, OrderLineItem, OrderServiceCharge, SearchOrdersFilter, SearchOrdersQuery, SearchOrdersSort, TerminalCheckoutQuery, TerminalCheckoutQueryFilter, TerminalCheckoutQuerySort, TerminalRefundQuery, TerminalRefundQueryFilter, TipSettings, InventoryChange, InventoryPhysicalCount, InventoryAdjustment, InventoryTransfer};
3use crate::objects::enums::{InventoryChangeType, OrderServiceChargeCalculationPhase, SearchOrdersSortField, SortOrder, TerminalCheckoutStatus};
4
5// -------------------------------------------------------------------------------------------------
6// SearchOrdersQuery builder implementation
7// -------------------------------------------------------------------------------------------------
8impl Validate for SearchOrdersQuery {
9    fn validate(self) -> Result<Self, ValidationError> {
10        Ok(self)
11    }
12}
13
14impl<T: ParentBuilder> Builder<SearchOrdersQuery, T> {
15    pub fn filter(mut self, filter: SearchOrdersFilter) -> Self {
16        self.body.filter = Some(filter);
17
18        self
19    }
20
21    pub fn sort_ascending(mut self) -> Self {
22        match self.body.sort.as_mut() {
23            Some(sort) => sort.sort_order= Some(SortOrder::Asc),
24            None => self.body.sort = Some(SearchOrdersSort {
25                sort_field: Some(SearchOrdersSortField::CreatedAt),
26                sort_order: Some(SortOrder::Asc),
27            })
28        }
29
30        self
31    }
32
33    pub fn sort_descending(mut self) -> Self {
34        match self.body.sort.as_mut() {
35            Some(sort) => sort.sort_order= Some(SortOrder::Desc),
36            None => self.body.sort = Some(SearchOrdersSort {
37                sort_field: Some(SearchOrdersSortField::CreatedAt),
38                sort_order: Some(SortOrder::Desc),
39            })
40        }
41
42        self
43    }
44
45    pub fn sort_field(mut self, sort_field: SearchOrdersSortField) -> Self {
46        match self.body.sort.as_mut() {
47            Some(sort) => sort.sort_field = Some(sort_field),
48            None => self.body.sort = Some(SearchOrdersSort {
49                sort_field: Some(sort_field),
50                sort_order: None,
51            })
52        }
53
54        self
55    }
56}
57// -------------------------------------------------------------------------------------------------
58// Order builder implementation
59// -------------------------------------------------------------------------------------------------
60// impl Validate for Order {
61//     fn validate(self) -> Result<Self, ValidationError> where Self: Sized {
62//         if self.location_id.is_some(){
63//             Ok(self)
64//         } else {
65//             Err(ValidationError)
66//         }
67//     }
68// }
69//
70// impl<T: ParentBuilder> Builder<Order, T> {
71//     pub fn location_id(mut self, location_id: String) -> Self {
72//         self.body.location_id = Some(location_id);
73//
74//         self
75//     }
76//
77//     pub fn version(mut self, version: i64) -> Self {
78//         self.body.version = Some(version);
79//
80//         self
81//     }
82//
83//     pub fn add_service_charge(mut self, service_charge: OrderServiceCharge) -> Self {
84//         if let Some(service_charges) = self.body.service_charges.as_mut() {
85//             service_charges.push(service_charge);
86//         } else {
87//             self.body.service_charges = Some(vec![service_charge])
88//         };
89//
90//         self
91//     }
92//
93//     pub fn add_order_item(mut self, order_item: OrderLineItem) -> Self {
94//         if let Some(line_items) = self.body.line_items.as_mut() {
95//             line_items.push(order_item);
96//         } else {
97//             self.body.line_items = Some(vec![order_item])
98//         };
99//
100//         self
101//     }
102// }
103//
104// impl AddField<OrderServiceCharge> for Order {
105//     fn add_field(&mut self, field: OrderServiceCharge) {
106//         if let Some(service_charges) = self.service_charges.as_mut() {
107//             service_charges.push(field);
108//         } else {
109//             self.service_charges = Some(vec![field]);
110//         }
111//     }
112// }
113//
114// impl AddField<OrderLineItem> for Order {
115//     fn add_field(&mut self, field: OrderLineItem) {
116//         if let Some(line_items) = self.line_items.as_mut() {
117//             line_items.push(field);
118//         } else {
119//             self.line_items = Some(vec![field]);
120//         }
121//     }
122// }
123
124// -------------------------------------------------------------------------------------------------
125// DeviceCheckoutOptions builder implementation
126// -------------------------------------------------------------------------------------------------
127impl Validate for DeviceCheckoutOptions {
128    fn validate(self) -> Result<Self, ValidationError> where Self: Sized {
129        if self.device_id.is_some() {
130            Ok(self)
131        } else {
132            Err(ValidationError)
133        }
134    }
135}
136
137impl<T: ParentBuilder> Builder<DeviceCheckoutOptions, T> {
138    pub fn device_id(mut self, device_id: String) -> Self {
139        self.body.device_id = Some(device_id);
140
141        self
142    }
143
144    pub fn collect_signature(mut self) -> Self {
145        self.body.collect_signature = Some(true);
146
147        self
148    }
149
150    pub fn show_itemized_cart(mut self) -> Self {
151        self.body.show_itemized_cart = Some(true);
152
153        self
154    }
155
156    pub fn skip_receipt_screen(mut self) -> Self {
157        self.body.skip_receipt_screen = Some(true);
158
159        self
160    }
161
162    pub fn tip_settings(mut self, tip_settings: TipSettings) -> Self {
163        self.body.tip_settings = Some(tip_settings);
164
165        self
166    }
167}
168
169// -------------------------------------------------------------------------------------------------
170// TerminalCheckoutQuery builder implementation
171// -------------------------------------------------------------------------------------------------
172impl Validate for TerminalCheckoutQuery {
173    fn validate(self) -> Result<Self, ValidationError> where Self: Sized {
174        Ok(self)
175    }
176}
177
178impl<T: ParentBuilder> Builder<TerminalCheckoutQuery, T> {
179    pub fn sort_ascending(mut self) -> Self {
180        self.body.sort = Some(TerminalCheckoutQuerySort { sort_order: Some(SortOrder::Asc) });
181
182        self
183    }
184
185    pub fn sort_descending(mut self) -> Self {
186        self.body.sort = Some(TerminalCheckoutQuerySort { sort_order: Some(SortOrder::Desc) });
187
188        self
189    }
190
191    pub fn created_at(mut self, created_at: TimeRange) -> Self {
192        if let Some(filter) = self.body.filter.as_mut() {
193            filter.created_at = Some(created_at);
194        } else {
195            self.body.filter = Some(TerminalCheckoutQueryFilter {
196                created_at: Some(created_at),
197                device_id: None,
198                status: None
199            })
200        };
201
202        self
203    }
204
205    pub fn device_id(mut self, device_id: String) -> Self {
206        if let Some(filter) = self.body.filter.as_mut() {
207            filter.device_id = Some(device_id);
208        } else {
209            self.body.filter = Some(TerminalCheckoutQueryFilter {
210                created_at: None,
211                device_id: Some(device_id),
212                status: None
213            })
214        };
215
216        self
217    }
218
219    pub fn status(mut self, status: TerminalCheckoutStatus) -> Self {
220        if let Some(filter) = self.body.filter.as_mut() {
221            filter.status = Some(status);
222        } else {
223            self.body.filter = Some(TerminalCheckoutQueryFilter {
224                created_at: None,
225                device_id: None,
226                status: Some(status)
227            })
228        };
229
230        self
231    }
232}
233
234// -------------------------------------------------------------------------------------------------
235// SearchOrdersQuery builder implementation
236// -------------------------------------------------------------------------------------------------
237impl Validate for TerminalRefundQuery {
238    fn validate(self) -> Result<Self, ValidationError> where Self: Sized {
239        Ok(self)
240    }
241}
242
243impl<T: ParentBuilder> Builder<TerminalRefundQuery, T> {
244    pub fn created_at(mut self, created_at: TimeRange) -> Self {
245        if let Some(filter) = self.body.filter.as_mut() {
246            filter.created_at = Some(created_at)
247        } else {
248            self.body.filter = Some(TerminalRefundQueryFilter {
249                created_at: Some(created_at),
250                device_id: None,
251                status: None
252            })
253        }
254
255        self
256    }
257
258    pub fn device_id(mut self, device_id: String) -> Self {
259        if let Some(filter) = self.body.filter.as_mut() {
260            filter.device_id = Some(device_id)
261        } else {
262            self.body.filter = Some(TerminalRefundQueryFilter {
263                created_at: None,
264                device_id: Some(device_id),
265                status: None
266            })
267        }
268
269        self
270    }
271
272    pub fn pending(mut self) -> Self {
273        if let Some(filter) = self.body.filter.as_mut() {
274            filter.status = Some(TerminalCheckoutStatus::Pending)
275        } else {
276            self.body.filter = Some(TerminalRefundQueryFilter {
277                created_at: None,
278                device_id: None,
279                status: Some(TerminalCheckoutStatus::Pending)
280            })
281        }
282
283        self
284    }
285
286    pub fn in_progress(mut self) -> Self {
287        if let Some(filter) = self.body.filter.as_mut() {
288            filter.status = Some(TerminalCheckoutStatus::InProgress)
289        } else {
290            self.body.filter = Some(TerminalRefundQueryFilter {
291                created_at: None,
292                device_id: None,
293                status: Some(TerminalCheckoutStatus::InProgress)
294            })
295        }
296
297        self
298    }
299
300    pub fn cancel_requested(mut self) -> Self {
301        if let Some(filter) = self.body.filter.as_mut() {
302            filter.status = Some(TerminalCheckoutStatus::CancelRequested)
303        } else {
304            self.body.filter = Some(TerminalRefundQueryFilter {
305                created_at: None,
306                device_id: None,
307                status: Some(TerminalCheckoutStatus::CancelRequested)
308            })
309        }
310
311        self
312    }
313
314    pub fn canceled(mut self) -> Self {
315        if let Some(filter) = self.body.filter.as_mut() {
316            filter.status = Some(TerminalCheckoutStatus::Canceled)
317        } else {
318            self.body.filter = Some(TerminalRefundQueryFilter {
319                created_at: None,
320                device_id: None,
321                status: Some(TerminalCheckoutStatus::Canceled)
322            })
323        }
324
325        self
326    }
327
328    pub fn completed(mut self) -> Self {
329        if let Some(filter) = self.body.filter.as_mut() {
330            filter.status = Some(TerminalCheckoutStatus::Completed)
331        } else {
332            self.body.filter = Some(TerminalRefundQueryFilter {
333                created_at: None,
334                device_id: None,
335                status: Some(TerminalCheckoutStatus::Completed)
336            })
337        }
338
339        self
340    }
341
342    pub fn sort_ascending(mut self) -> Self {
343        self.body.sort = Some(TerminalCheckoutQuerySort{ sort_order: Some(SortOrder::Asc) });
344
345        self
346    }
347
348    pub fn sort_descending(mut self) -> Self {
349        self.body.sort = Some(TerminalCheckoutQuerySort{ sort_order: Some(SortOrder::Desc) });
350
351        self
352    }
353}
354
355// -------------------------------------------------------------------------------------------------
356// SearchOrdersQuery builder implementation
357// -------------------------------------------------------------------------------------------------
358impl Validate for InventoryChange {
359    fn validate(self) -> Result<Self, ValidationError> where Self: Sized {
360        Ok(self)
361    }
362}
363
364impl<T: ParentBuilder> Builder<InventoryChange, T> {
365    pub fn change_type(mut self, change_type: InventoryChangeType) -> Self {
366        self.body.inventory_change_type = change_type;
367
368        self
369    }
370
371    pub fn physical_count(mut self, physical_count: InventoryPhysicalCount) -> Self {
372        self.body.physical_count = Some(physical_count);
373
374        self
375    }
376
377    pub fn adjustment(mut self, adjustment: InventoryAdjustment) -> Self {
378        self.body.adjustment = Some(adjustment);
379
380        self
381    }
382
383    pub fn transfer(mut self, transfer: InventoryTransfer) -> Self {
384        self.body.transfer = Some(transfer);
385
386        self
387    }
388}