use futures::{future::LocalBoxFuture, FutureExt};
use http::{HeaderMap, StatusCode};
use reqwest::Response as ReqwestResponse;
use serde_json::Value;
pub trait Response {
fn status(&self) -> StatusCode;
fn json<'a>(self) -> LocalBoxFuture<'a, Option<Value>>;
fn headers(&self) -> HeaderMap;
}
impl Response for ReqwestResponse {
fn status(&self) -> StatusCode {
self.status()
}
fn json<'a>(self) -> LocalBoxFuture<'a, Option<Value>> {
async move {
if let Ok(bytes) = self.bytes().await {
if bytes.is_empty() {
return None;
}
let json: Value = serde_json::from_slice(&bytes).expect("Failed to decode json");
Some(json)
} else {
None
}
}
.boxed_local()
}
fn headers(&self) -> HeaderMap {
self.headers().clone()
}
}