use serde::Deserialize;
#[derive(Debug, Clone, Deserialize)]
pub struct Page<T> {
pub items: Vec<T>,
#[serde(default)]
pub total: Option<u64>,
#[serde(default)]
pub limit: Option<u32>,
#[serde(default)]
pub next_page_token: Option<String>,
}
#[cfg(test)]
mod tests {
use super::*;
#[derive(Debug, Deserialize, PartialEq, Eq)]
struct Thing {
id: String,
}
#[test]
fn deserializes_full_page() {
let json =
r#"{"items":[{"id":"a"},{"id":"b"}],"total":42,"limit":50,"next_page_token":"tok_1"}"#;
let page: Page<Thing> = serde_json::from_str(json).unwrap();
assert_eq!(page.items.len(), 2);
assert_eq!(page.total, Some(42));
assert_eq!(page.limit, Some(50));
assert_eq!(page.next_page_token.as_deref(), Some("tok_1"));
}
#[test]
fn deserializes_final_page_without_token() {
let json = r#"{"items":[{"id":"z"}],"total":1,"limit":50}"#;
let page: Page<Thing> = serde_json::from_str(json).unwrap();
assert_eq!(page.items, vec![Thing { id: "z".into() }]);
assert_eq!(page.next_page_token, None);
}
}