macro_rules! obj_from_url {
( $c:expr, $url: expr, $rt: ty, $r: ident) => {{
let params = vec![("_verbosity", "1")];
$c.get::<$rt>($url, Some(¶ms))
.await?
.payload
.ok_or(SmugMugError::ResponseMissing())
.map(|mut v| {
v.$r.client = Some($c.clone());
v.$r
})
}};
}
macro_rules! obj_update_from_url {
( $c:expr, $url: expr, $d: expr,$rt: ty, $r: ident) => {{
let params = vec![("_verbosity", "1")];
$c.patch::<$rt>($url, $d, Some(¶ms))
.await?
.payload
.ok_or(SmugMugError::ResponseMissing())
.map(|mut v| {
v.$r.client = Some($c.clone());
v.$r
})
}};
}
macro_rules! obj_update_from_uri {
( $c:expr, $uri: expr, $d: expr,$rt: ty, $r: ident) => {{
let req_url = url::Url::parse(API_ORIGIN)?.join($uri)?;
obj_update_from_url!($c, req_url.as_str(), $d, $rt, $r)
}};
}
macro_rules! objs_from_id_slice {
( $c:expr, $ids:expr, $uri:expr, $rt: ty, $r: ident) => {{
if $ids.is_empty() {
return Ok(Vec::new());
}
let params = vec![("_verbosity", "1")];
let req_url = url::Url::parse(API_ORIGIN)?
.join($uri)?
.join($ids.join(",").as_str())?;
$c.get::<$rt>(req_url.as_str(), Some(¶ms))
.await?
.payload
.ok_or(SmugMugError::ResponseMissing())
.map(|v| {
v.$r.into_iter()
.map(|mut v| {
v.client = Some($c.clone());
v
})
.collect()
})
}};
}
macro_rules! stream_children_from_url {
( $c:expr, $url: expr, $params:expr, $rt: ty, $r: ident) => {{
let params = vec![("_verbosity", "1")];
try_stream! {
if let Some(url) = $url {
let mut req_url = url::Url::parse_with_params(API_ORIGIN, $params)?.join(url)?;
loop {
let resp = $c.get::<$rt>(
req_url.as_str(), Some(¶ms)
).await?
.payload
.ok_or(SmugMugError::ResponseMissing())?;
for mut item in resp.$r {
item.client = Some($c.clone());
yield item
}
if let Some(next_page) = resp.pages.and_then(|p| p.next_page) {
req_url = url::Url::parse(API_ORIGIN)?.join(&next_page)?;
} else {
break;
}
}
}
}
}};
}
pub(crate) use {
obj_from_url, obj_update_from_uri, obj_update_from_url, objs_from_id_slice,
stream_children_from_url,
};