Skip to main content

tdm_server_rust/utils/
page.rs

1//! 分页辅助工具 (Pagination Utilities)
2//!
3//! 提供内存分页 (`paginate`) 和已分页结果包装 (`slice_rows`)。
4//! 对齐 Java `PageHelper` 行为。
5
6use crate::common::PageBean;
7
8/// 对全量列表做内存分页(对齐 PageHelper 行为)
9pub fn paginate<T: Clone>(all: Vec<T>, page: i32, page_size: i32) -> PageBean<T> {
10    let total = all.len() as i64;
11    let page = page.max(1) as usize;
12    let page_size = page_size.max(1) as usize;
13    let start = (page - 1) * page_size;
14    let rows = if start >= all.len() {
15        vec![]
16    } else {
17        all[start..all.len().min(start + page_size)].to_vec()
18    };
19    PageBean::new(total, rows)
20}
21
22/// 包装 SQL 分页查询结果
23///
24/// 将 Repository 层返回的 `(total, rows)` 二元组包装为 [`PageBean`]。
25/// 与 [`paginate`] 不同,本函数不做内存截取,直接使用 SQL 查询返回的分页行。
26///
27/// # 参数
28///
29/// - `rows`: SQL LIMIT/OFFSET 查询返回的当前页行数据
30/// - `total`: COUNT 查询返回的总行数
31///
32/// # 返回值
33///
34/// 返回 [`PageBean<T>`],`total` 为总记录数,`rows` 为当前页数据。
35pub fn slice_rows<T>(rows: Vec<T>, total: i64) -> PageBean<T> {
36    PageBean::new(total, rows)
37}