1use serde::{de::DeserializeOwned, Deserialize, Serialize};
3
4fn vec_without_nulls<'de, D, T>(deserializer: D) -> Result<Vec<T>, D::Error>
7where
8 T: serde::Deserialize<'de>,
9 D: serde::Deserializer<'de>,
10{
11 let v = Vec::<Option<T>>::deserialize(deserializer)?;
12 Ok(v.into_iter().flatten().collect())
13}
14
15#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Default)]
17pub struct Page<T: DeserializeOwned> {
18 pub href: String,
19 #[serde(deserialize_with = "vec_without_nulls")]
20 pub items: Vec<T>,
21 pub limit: u32,
22 pub next: Option<String>,
23 pub offset: u32,
24 pub previous: Option<String>,
25 pub total: u32,
28}
29
30#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Default)]
32pub struct CursorBasedPage<T> {
33 pub href: String,
34 pub items: Vec<T>,
35 pub limit: u32,
36 pub next: Option<String>,
37 pub cursors: Option<Cursor>,
38 pub total: Option<u32>,
41}
42
43#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Default)]
45pub struct Cursor {
46 pub after: Option<String>,
47}