areq_json/
proto.rs

1use {
2    areq::{
3        Request,
4        body::{Body, IntoRequestBody},
5        http::{HeaderValue, header},
6    },
7    serde::Serialize,
8    std::{io::Error, marker::PhantomData},
9};
10
11pub struct Json<T>
12where
13    T: ?Sized,
14{
15    buffer: String,
16    ty: PhantomData<fn() -> T>,
17}
18
19impl<T> Json<T>
20where
21    T: ?Sized,
22{
23    pub fn new(t: &T) -> Result<Self, Error>
24    where
25        T: Serialize,
26    {
27        let buffer = serde_json::to_string(t)?;
28        Ok(Self {
29            buffer,
30            ty: PhantomData,
31        })
32    }
33}
34
35impl<T> IntoRequestBody for Json<T>
36where
37    T: ?Sized,
38{
39    type Chunk = <String as Body>::Chunk;
40    type Body = String;
41
42    fn into_req_body(self) -> Self::Body {
43        self.buffer
44    }
45
46    fn upd_req(req: &mut Request<Self::Body>) {
47        req.headers_mut()
48            .entry(header::CONTENT_TYPE)
49            .or_insert(HeaderValue::from_static("application/json"));
50    }
51}
52
53impl<'str, T> IntoRequestBody for &'str Json<T>
54where
55    T: ?Sized,
56{
57    type Chunk = <&'str str as Body>::Chunk;
58    type Body = &'str str;
59
60    fn into_req_body(self) -> Self::Body {
61        &self.buffer
62    }
63
64    fn upd_req(req: &mut Request<Self::Body>) {
65        req.headers_mut()
66            .entry(header::CONTENT_TYPE)
67            .or_insert(HeaderValue::from_static("application/json"));
68    }
69}