Skip to main content

max / makenotwork

1.7 KB · 58 lines History Blame Raw
1 //! Shared pagination helpers for the public page handlers.
2
3 use crate::constants;
4
5 /// Build a sliding window of page numbers for pagination controls.
6 ///
7 /// One definition for every public list page (feed, discover, landing), they
8 /// previously each carried a byte-identical copy, so a tweak to the window
9 /// behavior had to be made in lockstep or silently drift.
10 pub(super) fn build_pagination_range(current_page: u32, total_pages: u32) -> Vec<u32> {
11 if total_pages <= constants::PAGINATION_WINDOW_SIZE {
12 (1..=total_pages).collect()
13 } else {
14 let start = current_page.saturating_sub(2).max(1);
15 let end = (start + 4).min(total_pages);
16 let start = end.saturating_sub(4).max(1);
17 (start..=end).collect()
18 }
19 }
20
21 #[cfg(test)]
22 mod tests {
23 use super::*;
24
25 #[test]
26 fn pagination_small_total() {
27 assert_eq!(build_pagination_range(1, 3), vec![1, 2, 3]);
28 assert_eq!(build_pagination_range(2, 5), vec![1, 2, 3, 4, 5]);
29 }
30
31 #[test]
32 fn pagination_large_at_start() {
33 assert_eq!(build_pagination_range(1, 20), vec![1, 2, 3, 4, 5]);
34 assert_eq!(build_pagination_range(2, 20), vec![1, 2, 3, 4, 5]);
35 }
36
37 #[test]
38 fn pagination_large_at_middle() {
39 assert_eq!(build_pagination_range(10, 20), vec![8, 9, 10, 11, 12]);
40 }
41
42 #[test]
43 fn pagination_large_at_end() {
44 assert_eq!(build_pagination_range(20, 20), vec![16, 17, 18, 19, 20]);
45 assert_eq!(build_pagination_range(19, 20), vec![16, 17, 18, 19, 20]);
46 }
47
48 #[test]
49 fn pagination_zero_pages() {
50 assert_eq!(build_pagination_range(1, 0), Vec::<u32>::new());
51 }
52
53 #[test]
54 fn pagination_single_page() {
55 assert_eq!(build_pagination_range(1, 1), vec![1]);
56 }
57 }
58