use hyper::header::HeaderValue;
use hyper::{Response, StatusCode};
use http_body_util::combinators::BoxBody;
use http_body_util::{BodyExt, Full};
use hyper::body::Bytes;
use serde::Serialize;
use crate::error::ServeError;
use crate::handler::ResponseBody;
pub fn json<T: Serialize>(status: StatusCode, value: &T) -> Result<Response<ResponseBody>, ServeError> {
let body = serde_json::to_string(value)
.map_err(|_| ServeError::new(500, "failed to serialize response"))?;
let len = body.len();
let mut resp = Response::new(BoxBody::new(
Full::new(Bytes::from(body)).map_err(|never: std::convert::Infallible| match never {}),
));
*resp.status_mut() = status;
let headers = resp.headers_mut();
headers.insert(hyper::header::CONTENT_TYPE, HeaderValue::from_static("application/json"));
headers.insert(hyper::header::CONTENT_LENGTH, len.into());
Ok(resp)
}