use super::IntoResponse;
use crate::headers::ContentType;
use crate::{Body, Response, dep::http::StatusCode};
use bytes::{BufMut, BytesMut};
use rama_core::error::OpaqueError;
use rama_utils::macros::impl_deref;
use serde::Serialize;
use std::fmt;
use super::Headers;
pub struct Json<T>(pub T);
impl<T: fmt::Debug> fmt::Debug for Json<T> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_tuple("Json").field(&self.0).finish()
}
}
impl<T: Clone> Clone for Json<T> {
fn clone(&self) -> Self {
Self(self.0.clone())
}
}
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_respone(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_respone(buf.into_inner(), res)
}
}
impl<T> TryInto<Body> for Json<T>
where
T: Serialize,
{
type Error = OpaqueError;
fn try_into(self) -> Result<Body, Self::Error> {
let mut buf = BytesMut::with_capacity(128).writer();
match serde_json::to_writer(&mut buf, &self.0) {
Ok(()) => Ok(buf.into_inner().freeze().into()),
Err(err) => Err(OpaqueError::from_std(err)),
}
}
}