api_tools/value_objects/
pagination.rs1pub const PAGINATION_MIN_LIMIT: u32 = 50;
5
6pub const PAGINATION_MAX_LIMIT: u32 = 500;
8
9pub const PAGINATION_DEFAULT_LIMIT: u32 = 200;
11
12#[derive(Debug, Clone, PartialEq, Eq)]
13pub struct Pagination {
14 page: u32,
15 limit: u32,
16 max_limit: Option<u32>,
17}
18
19impl Pagination {
20 pub fn new(page: u32, limit: u32, max_limit: Option<u32>) -> Self {
54 let page = if page == 0 { 1 } else { page };
55
56 let mut max = max_limit.unwrap_or(PAGINATION_MAX_LIMIT);
57
58 if max > PAGINATION_MAX_LIMIT {
59 max = PAGINATION_MAX_LIMIT;
60 }
61
62 let limit = if limit > max {
63 max
64 } else if limit < PAGINATION_MIN_LIMIT {
65 PAGINATION_MIN_LIMIT
66 } else {
67 limit
68 };
69
70 Self { page, limit, max_limit }
71 }
72
73 pub fn page(&self) -> u32 {
75 self.page
76 }
77
78 pub fn limit(&self) -> u32 {
80 self.limit
81 }
82
83 pub fn set_max_limit(&mut self, max_limit: u32) {
85 let max_limit = max_limit.clamp(PAGINATION_MIN_LIMIT, PAGINATION_MAX_LIMIT);
86 self.max_limit = Some(max_limit);
87 }
88}
89
90impl Default for Pagination {
91 fn default() -> Self {
93 let default = if PAGINATION_DEFAULT_LIMIT > PAGINATION_MAX_LIMIT {
94 PAGINATION_MAX_LIMIT
95 } else {
96 PAGINATION_DEFAULT_LIMIT
97 };
98 Self::new(1, default, None)
99 }
100}
101
102#[derive(Debug, Clone, PartialEq)]
104
105pub struct PaginationResponse {
106 pub page: u32,
107 pub limit: u32,
108 pub total: i64,
109}
110
111impl PaginationResponse {
112 pub fn new(page: u32, limit: u32, total: i64) -> Self {
114 Self { page, limit, total }
115 }
116}
117
118#[cfg(test)]
119mod test {
120 use super::*;
121
122 #[test]
123 fn test_set_max_limit() {
124 let mut pagination = Pagination::default();
125 assert_eq!(pagination.max_limit, None);
126
127 pagination.set_max_limit(100);
128 assert_eq!(pagination.max_limit, Some(100));
129
130 pagination.set_max_limit(300);
131 assert_eq!(pagination.max_limit, Some(300));
132
133 pagination.set_max_limit(20);
134 assert_eq!(pagination.max_limit, Some(PAGINATION_MIN_LIMIT));
135
136 pagination.set_max_limit(600);
137 assert_eq!(pagination.max_limit, Some(PAGINATION_MAX_LIMIT));
138 }
139
140 #[test]
141 fn test_default() {
142 let pagination = Pagination::default();
143 assert_eq!(pagination.page(), 1);
144 assert_eq!(pagination.limit(), PAGINATION_DEFAULT_LIMIT);
145 assert_eq!(pagination.max_limit, None);
146 }
147}