use super::IntoResponse;
use crate::headers::ContentType;
use crate::{Body, Response, StatusCode};
use rama_core::bytes::{BufMut, BytesMut};
use rama_core::error::BoxError;
use rama_utils::macros::impl_deref;
use serde::Serialize;
use super::Headers;
#[derive(Debug, Clone)]
pub struct Json<T>(pub T);
impl_deref!(Json);
impl<T> From<T> for Json<T> {
fn from(inner: T) -> Self {
Self(inner)
}
}
impl<T> IntoResponse for Json<T>
where
T: Serialize,
{
fn into_response(self) -> Response {
fn make_response(buf: BytesMut, ser_result: serde_json::Result<()>) -> Response {
match ser_result {
Ok(()) => (Headers::single(ContentType::json()), buf.freeze()).into_response(),
Err(err) => (
StatusCode::INTERNAL_SERVER_ERROR,
Headers::single(ContentType::text_utf8()),
err.to_string(),
)
.into_response(),
}
}
let mut buf = BytesMut::with_capacity(128).writer();
let res = serde_json::to_writer(&mut buf, &self.0);
make_response(buf.into_inner(), res)
}
}
impl<T> TryFrom<Json<T>> for Body
where
T: Serialize,
{
type Error = BoxError;
fn try_from(json: Json<T>) -> Result<Self, Self::Error> {
let mut buf = BytesMut::with_capacity(128).writer();
match serde_json::to_writer(&mut buf, &json.0) {
Ok(()) => Ok(buf.into_inner().freeze().into()),
Err(err) => Err(BoxError::from(err)),
}
}
}