#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct Page<T> {
#[serde(default)]
pub data: Vec<T>,
#[serde(default)]
pub has_more: Option<bool>,
#[serde(default)]
pub first_id: Option<String>,
#[serde(default)]
pub last_id: Option<String>,
#[serde(default)]
pub object: Option<String>,
}
#[derive(Debug, Clone, Copy, Default)]
pub struct PaginationQuery<'a> {
pub before: Option<&'a str>,
pub after: Option<&'a str>,
pub limit: Option<u32>,
pub order: Option<PaginationOrder>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum PaginationOrder {
Asc,
#[default]
Desc,
}
impl PaginationOrder {
#[must_use]
pub fn as_str(self) -> &'static str {
match self {
PaginationOrder::Asc => "asc",
PaginationOrder::Desc => "desc",
}
}
}
impl<'a> PaginationQuery<'a> {
pub fn append_to<T: url::form_urlencoded::Target>(
&self,
pairs: &mut url::form_urlencoded::Serializer<'_, T>,
) {
if let Some(before) = self.before {
pairs.append_pair("before", before);
}
if let Some(after) = self.after {
pairs.append_pair("after", after);
}
if let Some(limit) = self.limit {
pairs.append_pair("limit", &limit.to_string());
}
if let Some(order) = self.order {
pairs.append_pair("order", order.as_str());
}
}
#[must_use]
pub fn any_set(&self) -> bool {
self.before.is_some()
|| self.after.is_some()
|| self.limit.is_some()
|| self.order.is_some()
}
}