titan_types/
pagination.rs

1use serde::{Deserialize, Deserializer, Serialize};
2
3#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
4pub struct Pagination {
5    #[serde(default = "default_skip")]
6    pub skip: u64,
7    #[serde(default = "default_limit", deserialize_with = "clamp_limit")]
8    pub limit: u64,
9}
10
11impl Default for Pagination {
12    fn default() -> Self {
13        Pagination {
14            skip: 0,
15            limit: default_limit(),
16        }
17    }
18}
19
20fn default_skip() -> u64 {
21    0
22}
23
24fn default_limit() -> u64 {
25    50
26}
27
28fn clamp_limit<'de, D>(deserializer: D) -> Result<u64, D::Error>
29where
30    D: Deserializer<'de>,
31{
32    let limit = u64::deserialize(deserializer)?;
33
34    // Clamp the limit to a maximum of 50 entries.
35    Ok(limit.min(default_limit()))
36}
37
38impl Into<Pagination> for (u64, u64) {
39    fn into(self) -> Pagination {
40        Pagination {
41            skip: self.0,
42            limit: self.1,
43        }
44    }
45}
46
47impl Into<(u64, u64)> for Pagination {
48    fn into(self) -> (u64, u64) {
49        (self.skip, self.limit)
50    }
51}
52
53#[derive(Debug, Clone, Serialize, Deserialize)]
54pub struct PaginationResponse<T> {
55    pub items: Vec<T>,
56    pub offset: u64,
57}