areq_json/
body.rs

1use {
2    areq::{
3        body::{Body, IntoBody},
4        bytes::Buf,
5    },
6    serde::{Deserialize, de::DeserializeOwned},
7    std::io::Error,
8};
9
10/// Extension methods for a [body](Body) for working with JSON.
11pub 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 {}