Skip to main content

ahri_tre_protocol/
pagination.rs

1use serde::{Deserialize, Serialize};
2
3pub const DEFAULT_PAGE_LIMIT: u16 = 100;
4pub const MAX_PAGE_LIMIT: u16 = 500;
5
6#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
7pub struct PageRequest {
8    #[serde(default, skip_serializing_if = "Option::is_none")]
9    pub cursor: Option<String>,
10    #[serde(default = "default_page_limit")]
11    pub limit: u16,
12}
13
14impl Default for PageRequest {
15    fn default() -> Self {
16        Self {
17            cursor: None,
18            limit: DEFAULT_PAGE_LIMIT,
19        }
20    }
21}
22
23impl PageRequest {
24    pub fn validate(&self) -> Result<(), String> {
25        if self.limit == 0 {
26            return Err("page limit must be greater than zero".to_string());
27        }
28        if self.limit > MAX_PAGE_LIMIT {
29            return Err(format!("page limit must be at most {MAX_PAGE_LIMIT}"));
30        }
31        Ok(())
32    }
33}
34
35#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
36pub struct Page<T> {
37    pub items: Vec<T>,
38    #[serde(default, skip_serializing_if = "Option::is_none")]
39    pub next_cursor: Option<String>,
40}
41
42const fn default_page_limit() -> u16 {
43    DEFAULT_PAGE_LIMIT
44}