vantage_table/
pagination.rs1use vantage_expressions::traits::selectable::Selectable;
2
3#[derive(Debug, Clone, Copy, PartialEq, Eq)]
5pub struct Pagination {
6 page: i64,
7 items_per_page: i64,
8}
9
10impl Pagination {
11 pub fn new(page: i64, items_per_page: i64) -> Self {
13 Self {
14 page: page.max(1),
15 items_per_page: items_per_page.max(1),
16 }
17 }
18
19 pub fn set_page(&mut self, page: i64) {
21 self.page = page.max(1);
22 }
23
24 pub fn set_ipp(&mut self, items_per_page: i64) {
27 let items_per_page = items_per_page.max(1);
28
29 let first_item_index = (self.page - 1) * self.items_per_page;
31
32 self.page = (first_item_index / items_per_page) + 1;
34 self.items_per_page = items_per_page;
35 }
36
37 pub fn get_page(&self) -> i64 {
39 self.page
40 }
41
42 pub fn get_ipp(&self) -> i64 {
44 self.items_per_page
45 }
46
47 pub fn limit(&self) -> i64 {
49 self.items_per_page
50 }
51
52 pub fn skip(&self) -> i64 {
54 (self.page - 1) * self.items_per_page
55 }
56
57 pub fn apply_on_select<S, E>(&self, select: &mut S)
59 where
60 S: Selectable<E>,
61 {
62 select.set_limit(Some(self.limit()), Some(self.skip()));
63 }
64}
65
66impl Default for Pagination {
67 fn default() -> Self {
68 Self {
69 page: 1,
70 items_per_page: 50,
71 }
72 }
73}
74
75#[cfg(test)]
76mod tests {
77 use super::*;
78
79 #[test]
80 fn test_new_pagination() {
81 let p = Pagination::new(2, 25);
82 assert_eq!(p.get_page(), 2);
83 assert_eq!(p.get_ipp(), 25);
84 assert_eq!(p.limit(), 25);
85 assert_eq!(p.skip(), 25);
86 }
87
88 #[test]
89 fn test_pagination_bounds() {
90 let p = Pagination::new(0, 0);
91 assert_eq!(p.get_page(), 1);
92 assert_eq!(p.get_ipp(), 1);
93 }
94
95 #[test]
96 fn test_set_page() {
97 let mut p = Pagination::new(1, 10);
98 p.set_page(3);
99 assert_eq!(p.get_page(), 3);
100 assert_eq!(p.skip(), 20);
101 }
102
103 #[test]
104 fn test_set_ipp_keeps_focus() {
105 let mut p = Pagination::new(3, 10);
106 p.set_ipp(5);
110 assert_eq!(p.get_page(), 5);
112 assert_eq!(p.get_ipp(), 5);
113 assert_eq!(p.skip(), 20);
114 }
115
116 #[test]
117 fn test_set_ipp_larger_page_size() {
118 let mut p = Pagination::new(5, 5);
119 p.set_ipp(25);
122 assert_eq!(p.get_page(), 1);
124 assert_eq!(p.get_ipp(), 25);
125 assert_eq!(p.skip(), 0);
126 }
127
128 #[test]
129 fn test_default_pagination() {
130 let p = Pagination::default();
131 assert_eq!(p.get_page(), 1);
132 assert_eq!(p.get_ipp(), 50);
133 assert_eq!(p.skip(), 0);
134 }
135}