use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
#[derive(Debug, Default, Serialize, Deserialize, JsonSchema)]
pub struct Pagination {
#[serde(default, alias = "p")]
#[schemars(example = 0, example = 1, example = 2)]
pub page: Option<usize>,
#[serde(default)]
#[schemars(example = 100, example = 1000)]
pub per_page: Option<usize>,
}
impl Pagination {
pub const DEFAULT_PER_PAGE: usize = 1_000;
pub const MAX_PER_PAGE: usize = 1_000;
pub fn page(&self) -> usize {
self.page.unwrap_or_default()
}
pub fn per_page(&self) -> usize {
self.per_page
.unwrap_or(Self::DEFAULT_PER_PAGE)
.min(Self::MAX_PER_PAGE)
}
pub fn start(&self, len: usize) -> usize {
self.page().saturating_mul(self.per_page()).min(len)
}
pub fn end(&self, len: usize) -> usize {
(self.page().saturating_add(1))
.saturating_mul(self.per_page())
.min(len)
}
}