use serde::{de::DeserializeOwned, Deserialize, Serialize};
fn vec_without_nulls<'de, D, T>(deserializer: D) -> Result<Vec<T>, D::Error>
where
T: serde::Deserialize<'de>,
D: serde::Deserializer<'de>,
{
let v = Vec::<Option<T>>::deserialize(deserializer)?;
Ok(v.into_iter().flatten().collect())
}
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Default)]
pub struct Page<T: DeserializeOwned> {
pub href: String,
#[serde(deserialize_with = "vec_without_nulls")]
pub items: Vec<T>,
pub limit: u32,
pub next: Option<String>,
pub offset: u32,
pub previous: Option<String>,
pub total: u32,
}
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Default)]
pub struct CursorBasedPage<T> {
pub href: String,
pub items: Vec<T>,
pub limit: u32,
pub next: Option<String>,
pub cursors: Option<Cursor>,
pub total: Option<u32>,
}
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Default)]
pub struct Cursor {
pub after: Option<String>,
}