use serde::{Deserialize, Deserializer};
use serde::de::DeserializeOwned;
use link::Link;
#[derive(Debug, Clone, Deserialize)]
pub struct PaginatedResponse<T: DeserializeOwned> {
#[serde(rename = "_links")] pub links: PageLinks,
#[serde(rename = "_embedded", deserialize_with = "nested_embeded_records")] pub records: Vec<T>,
}
impl<T: DeserializeOwned> PaginatedResponse<T> {
pub fn next(&self) -> &Link {
&self.links.next
}
pub fn prev(&self) -> &Link {
&self.links.prev
}
pub fn self_(&self) -> &Link {
&self.links.self_
}
}
#[derive(Debug, Clone, Deserialize)]
pub struct PageLinks {
#[serde(rename = "self")] pub self_: Link,
pub prev: Link,
pub next: Link,
}
fn nested_embeded_records<'de, D, T>(deserializer: D) -> Result<Vec<T>, D::Error>
where
D: Deserializer<'de>,
T: DeserializeOwned,
{
#[derive(Deserialize)]
struct RecordsContainer<T> {
records: Vec<T>,
}
RecordsContainer::deserialize(deserializer).map(|c| c.records)
}