titan_types/
pagination.rs1use 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 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}