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}