pipedash_plugin_api/
pagination.rs1use 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;