icydb_core/db/primitives/limit/
ext.rs

1use crate::db::primitives::limit::LimitExpr;
2
3///
4/// LimitSlot
5///
6
7pub trait LimitSlot {
8    fn limit_slot(&mut self) -> &mut Option<LimitExpr>;
9}
10
11///
12/// LimitExt
13///
14
15impl<T: LimitSlot> LimitExt for T {}
16
17pub trait LimitExt: LimitSlot + Sized {
18    #[must_use]
19    fn page(self, limit: Option<u32>, offset: Option<u32>) -> Self {
20        self.limit_opt(limit).offset_opt(offset)
21    }
22
23    #[must_use]
24    fn limit(self, limit: u32) -> Self {
25        let mut me = self;
26
27        let slot = me.limit_slot();
28        let expr = slot.take().unwrap_or_default().limit(limit);
29        *slot = Some(expr);
30
31        me
32    }
33
34    #[must_use]
35    fn limit_opt(self, opt: Option<u32>) -> Self {
36        if let Some(limit) = opt {
37            self.limit(limit)
38        } else {
39            self
40        }
41    }
42
43    #[must_use]
44    fn offset(self, offset: u32) -> Self {
45        let mut me = self;
46
47        let slot = me.limit_slot();
48        let expr = slot.take().unwrap_or_default().offset(offset);
49        *slot = Some(expr);
50
51        me
52    }
53
54    #[must_use]
55    fn offset_opt(self, opt: Option<u32>) -> Self {
56        if let Some(offset) = opt {
57            self.offset(offset)
58        } else {
59            self
60        }
61    }
62}