use serde::{Deserialize, Serialize};
use serde_json::{Map, Value};
use stac::Link;
use stac::api::{Context, Item};
#[derive(Debug, Deserialize, Serialize)]
pub struct Page {
pub features: Vec<Item>,
#[serde(skip_serializing_if = "Option::is_none")]
pub next: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub prev: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub context: Option<Context>,
#[serde(rename = "numberReturned", skip_serializing_if = "Option::is_none")]
pub number_returned: Option<usize>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub links: Vec<Link>,
#[serde(flatten)]
pub additional_fields: Map<String, Value>,
}
impl Page {
pub fn next_token(&self) -> Option<String> {
if let Some(next) = &self.next {
return Some(format!("next:{next}"));
}
self.links
.iter()
.find(|link| link.rel == "next")
.and_then(|link| extract_token_from_href(&link.href))
}
pub fn prev_token(&self) -> Option<String> {
if let Some(prev) = &self.prev {
return Some(format!("prev:{prev}"));
}
self.links
.iter()
.find(|link| link.rel == "prev")
.and_then(|link| extract_token_from_href(&link.href))
}
}
fn extract_token_from_href(href: &str) -> Option<String> {
href.split("token=")
.nth(1)
.and_then(|token_part| token_part.split('&').next())
.map(|token| token.to_string())
}