pub fn generate_pages(current: u32, total: u32, siblings: u32) -> Vec<u32> {
if total <= 1 {
return vec![1];
}
let total_pages = total as usize;
let current = current as usize;
let start = if current > (siblings as usize) + 2 {
current - siblings as usize
} else {
2
};
let end = if current + (siblings as usize) < total_pages - 1 {
current + siblings as usize
} else {
total_pages - 1
};
let mut pages = Vec::new();
pages.push(1);
if start > 3 {
pages.push(0); }
for page in start..=end {
pages.push(u32::try_from(page).expect("reason"));
}
if end < total_pages - 2 {
pages.push(0); }
if total > 1 {
pages.push(total);
}
let mut result: Vec<u32> = Vec::new();
let mut prev: Option<u32> = None;
for p in pages {
if Some(p) != prev {
result.push(p);
prev = Some(p);
}
}
result
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn generate_pages_single_page() {
let pages = generate_pages(1, 1, 1);
assert_eq!(pages, vec![1]);
}
#[test]
fn generate_pages_two_pages() {
let pages = generate_pages(1, 2, 1);
assert_eq!(pages, vec![1, 2]);
}
#[test]
fn generate_pages_first_page() {
let pages = generate_pages(1, 10, 1);
assert_eq!(pages, vec![1, 2, 0, 10]);
}
#[test]
fn generate_pages_last_page() {
let pages = generate_pages(10, 10, 1);
assert_eq!(pages, vec![1, 0, 9, 10]);
}
#[test]
fn generate_pages_middle_page() {
let pages = generate_pages(5, 10, 1);
assert!(!pages.is_empty());
assert!(pages.contains(&5));
assert_eq!(pages, vec![1, 0, 4, 5, 6, 0, 10]);
}
#[test]
fn generate_pages_with_ellipsis() {
let pages = generate_pages(5, 10, 1);
assert!(!pages.is_empty());
assert!(pages.contains(&0));
}
#[test]
fn generate_pages_many_siblings() {
let pages = generate_pages(5, 20, 3);
assert!(!pages.is_empty());
assert_eq!(pages, vec![1, 2, 3, 4, 5, 6, 7, 8, 0, 20]);
}
#[test]
fn generate_pages_edge_case_first() {
let pages = generate_pages(2, 10, 1);
assert!(pages.contains(&1));
assert!(pages.contains(&2));
assert_eq!(pages, vec![1, 2, 3, 0, 10]);
}
#[test]
fn generate_pages_edge_case_last() {
let pages = generate_pages(9, 10, 1);
assert!(pages.contains(&9));
assert!(pages.contains(&10));
assert_eq!(pages, vec![1, 0, 8, 9, 10]);
}
#[test]
fn generate_pages_all_visible() {
let pages = generate_pages(2, 3, 1);
assert_eq!(pages, vec![1, 2, 3]);
}
#[test]
fn generate_pages_current_equals_total() {
let pages = generate_pages(10, 10, 2);
assert!(pages.contains(&10));
assert_eq!(pages, vec![1, 0, 8, 9, 10]);
}
#[test]
fn generate_pages_siblings_zero() {
let pages = generate_pages(5, 10, 0);
assert_eq!(pages, vec![1, 0, 5, 0, 10]);
}
#[test]
fn generate_pages_no_ellipsis_after_first() {
let pages = generate_pages(2, 10, 1);
assert_eq!(pages, vec![1, 2, 3, 0, 10]);
}
#[test]
fn generate_pages_no_ellipsis_before_last() {
let pages = generate_pages(9, 10, 1);
assert_eq!(pages, vec![1, 0, 8, 9, 10]);
}
#[test]
fn generate_pages_both_ellipsis() {
let pages = generate_pages(4, 10, 1);
assert_eq!(pages, vec![1, 3, 4, 5, 0, 10]);
}
#[test]
fn generate_pages_no_ellipsis_when_total_small() {
let pages = generate_pages(2, 4, 1);
assert_eq!(pages, vec![1, 2, 3, 4]);
}
#[test]
fn generate_pages_show_all_when_siblings_large() {
let pages = generate_pages(3, 5, 10);
assert_eq!(pages, vec![1, 2, 3, 4, 5]);
}
}