Skip to main content

sark_json/
response.rs

1use o3::buffer::{Owned, Shared};
2use sark_core::http::EncodedBody;
3
4use crate::JsonEncode;
5use crate::encode::SliceWriter;
6
7pub struct JsonBody<T>(T);
8
9impl<T> JsonBody<T> {
10    pub fn new(value: T) -> Self {
11        Self(value)
12    }
13}
14
15impl<T> EncodedBody for JsonBody<T>
16where
17    T: JsonEncode,
18{
19    fn encoded_len(&self) -> usize {
20        self.0.json_len()
21    }
22
23    fn encode_into(&self, out: &mut [u8]) {
24        let mut writer = SliceWriter::new(out);
25        self.0.write_into(&mut writer);
26        assert_eq!(writer.finish(), out.len(), "JsonEncode length mismatch");
27    }
28
29    fn into_shared(self, encoded_len: usize) -> Shared {
30        let mut out = Owned::with_capacity(encoded_len);
31        self.0.write_into(&mut out);
32        assert_eq!(out.len(), encoded_len, "JsonEncode length mismatch");
33        out.freeze()
34    }
35}