Skip to main content

pipedash_plugin_api/
pagination.rs

1use crate::error::{
2    PluginError,
3    PluginResult,
4};
5use crate::types::{
6    PaginatedResponse,
7    PaginationParams,
8};
9
10pub fn paginate<T>(items: Vec<T>, params: PaginationParams) -> PluginResult<PaginatedResponse<T>> {
11    params.validate().map_err(PluginError::InvalidConfig)?;
12    let offset = params
13        .calculate_offset()
14        .map_err(PluginError::InvalidConfig)?;
15    let total_count = items.len();
16    let items: Vec<T> = items
17        .into_iter()
18        .skip(offset)
19        .take(params.page_size)
20        .collect();
21    let has_more = offset.saturating_add(items.len()) < total_count;
22    let total_pages = total_count.div_ceil(params.page_size);
23
24    Ok(PaginatedResponse {
25        items,
26        page: params.page,
27        page_size: params.page_size,
28        total_count,
29        total_pages,
30        has_more,
31    })
32}
33
34#[cfg(test)]
35mod tests;