use futures::{future::LocalBoxFuture, FutureExt};
use hyper::{
body::{Body, Buf},
header::HeaderMap,
http::{response::Response as HyperResponse, StatusCode},
};
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 HyperResponse<Body> {
fn status(&self) -> StatusCode {
self.status()
}
fn json<'a>(self) -> LocalBoxFuture<'a, Option<Value>> {
let (_, body) = self.into_parts();
let body = hyper::body::aggregate(body);
async {
let body = body.await.expect("Valid buffer");
if !body.has_remaining() {
return None;
}
let json: Value =
serde_json::from_reader(body.reader()).expect("Failed to decode json");
Some(json)
}
.boxed_local()
}
fn headers(&self) -> HeaderMap {
self.headers().clone()
}
}