use super::extension;
use serde::{Deserialize, Serialize};
use serde_with::serde_as;
use url::Url;
#[derive(Deserialize, Serialize, Clone, Debug, PartialEq, Default, Hash, Eq)]
#[serde_as]
#[serde(rename_all = "kebab-case", deny_unknown_fields)]
pub struct Query {
#[serde_as(as = "DisplayFromStr")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub limit: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub offset: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub filter: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub before: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub after: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub order: Option<extension::Order>,
}
impl Query {
pub fn is_empty(&self) -> bool {
*self == Default::default()
}
pub fn is_ranged(&self) -> bool {
let a = self
.after
.clone()
.filter(|c| !c.is_empty())
.unwrap_or_default()
.is_empty();
let b = self
.before
.clone()
.filter(|c| !c.is_empty())
.unwrap_or_default()
.is_empty();
!a || !b
}
pub fn extend_url(&self, base_url: &Url) -> Url {
let mut extended_url = base_url.clone();
if *self == Default::default() {
return extended_url;
};
let mut qp = extended_url.query_pairs_mut();
if let Some(ref limit) = self.limit {
qp.append_pair("limit", limit.as_str());
}
let _ = qp.finish();
drop(qp);
extended_url.clone()
}
}
#[derive(Serialize, Deserialize, PartialEq, Eq, Debug, Clone, Default)]
#[serde(rename_all = "kebab-case", deny_unknown_fields)]
pub struct Fields {
#[serde(default, skip_serializing_if = "Query::is_empty")]
pub paging: Query,
#[serde(alias = "_latest", default, skip_serializing_if = "Option::is_none")]
pub latest: Option<String>,
#[serde(alias = "_earliest", default, skip_serializing_if = "Option::is_none")]
pub earliest: Option<String>,
}
impl Fields {
pub fn is_empty(&self) -> bool {
self.earliest.is_none() && self.latest.is_none() && self.paging.is_empty()
}
}
#[derive(Serialize, Deserialize, PartialEq, Debug, Clone)]
#[serde(rename_all = "kebab-case", deny_unknown_fields)]
pub struct Response {
pub items: Vec<serde_json::Value>,
#[serde(default, flatten, skip_serializing_if = "Fields::is_empty")]
pub paging: Fields,
}