1use {
2 areq::{
3 body::{Body, IntoBody},
4 bytes::Buf,
5 },
6 serde::{Deserialize, de::DeserializeOwned},
7 std::io::Error,
8};
9
10pub trait JsonBodyExt: IntoBody {
12 async fn json<T>(self) -> Result<T, Error>
13 where
14 T: DeserializeOwned,
15 {
16 let mut body = self.into_body();
17 let cap = body.size_hint().size().unwrap_or(1024);
18 let mut v = Vec::with_capacity(cap as usize);
19 while let Some(res) = body.chunk().await {
20 v.extend_from_slice(res?.chunk());
21 }
22
23 let res = serde_json::from_slice(&v)?;
24 Ok(res)
25 }
26
27 async fn json_from_buffer<'de, T>(self, buffer: &'de mut Vec<u8>) -> Result<T, Error>
28 where
29 T: Deserialize<'de>,
30 {
31 let mut body = self.into_body();
32
33 let cap = body.size_hint().size().unwrap_or(1024);
34 buffer.clear();
35 buffer.reserve(cap as usize);
36 while let Some(res) = body.chunk().await {
37 buffer.extend_from_slice(res?.chunk());
38 }
39
40 let res = serde_json::from_slice(buffer)?;
41 Ok(res)
42 }
43}
44
45impl<B> JsonBodyExt for B where B: IntoBody {}