brk_interface/
pagination.rs

1use schemars::JsonSchema;
2use serde::Deserialize;
3
4use crate::{Index, deser::de_unquote_usize};
5
6#[derive(Debug, Default, Deserialize, JsonSchema)]
7pub struct PaginationParam {
8    #[schemars(description = "Pagination index")]
9    #[serde(default, alias = "p", deserialize_with = "de_unquote_usize")]
10    pub page: Option<usize>,
11}
12
13impl PaginationParam {
14    const PER_PAGE: usize = 1_000;
15
16    pub fn start(&self, len: usize) -> usize {
17        (self.page.unwrap_or_default() * Self::PER_PAGE).clamp(0, len)
18    }
19
20    pub fn end(&self, len: usize) -> usize {
21        ((self.page.unwrap_or_default() + 1) * Self::PER_PAGE).clamp(0, len)
22    }
23}
24
25#[derive(Debug, Deserialize, JsonSchema)]
26pub struct PaginatedIndexParam {
27    pub index: Index,
28    #[serde(flatten)]
29    pub pagination: PaginationParam,
30}