channel_server/request/
json.rs1use std::ops::{Deref, DerefMut};
2
3use serde::{de::DeserializeOwned, Serialize};
4
5use crate::{Body, ChannelError, FromRequest, IntoResponse, Request, Response, StatusCode};
6
7#[derive(Debug, Clone, Eq, PartialEq, Default)]
8pub struct Json<T>(pub T);
9
10impl<T> Deref for Json<T> {
11 type Target = T;
12
13 fn deref(&self) -> &Self::Target {
14 &self.0
15 }
16}
17
18impl<T> DerefMut for Json<T> {
19 fn deref_mut(&mut self) -> &mut Self::Target {
20 &mut self.0
21 }
22}
23
24impl<'a, T: DeserializeOwned> FromRequest<'a> for Json<T> {
25 fn from_request(_req: &'a Request, body: &mut Body) -> Result<Self, ChannelError> {
26 let data = body.take()?;
27 Ok(Self(
28 serde_json::from_slice(data.as_ref()).map_err(|_e| ChannelError::ParseJsonError)?,
29 ))
30 }
31}
32
33impl<T: Serialize + Send> IntoResponse for Json<T> {
34 fn into_response(self) -> Response {
35 let data = match serde_json::to_vec(&self.0) {
36 Ok(data) => data,
37 Err(err) => return Response::new().status(StatusCode::Fail(err.to_string())),
38 };
39 Response::new().status(StatusCode::ok()).body(data.into())
40 }
41}