serde_capture/
lib.rs

1use serde::de::Error;
2use serde::Deserialize;
3use serde::Deserializer;
4use serde::Serialize;
5use serde_derive::Deserialize;
6
7#[derive(Clone, Hash, Eq, PartialEq)]
8pub struct CaptureJson<T> {
9    pub inner: T,
10    pub bytes: Box<[u8]>,
11}
12
13#[derive(Deserialize)]
14pub struct Nothing {}
15
16impl<T> CaptureJson<T> {
17    pub fn into_inner(self) -> T {
18        self.inner
19    }
20
21    pub fn into_bytes(self) -> Box<[u8]> {
22        self.bytes
23    }
24}
25
26impl<'de, T: Deserialize<'de>> Deserialize<'de> for CaptureJson<T> {
27    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
28    where
29        D: Deserializer<'de>,
30    {
31        let inner = serde_json::Value::deserialize(deserializer)?;
32
33        let mut bytes = Vec::with_capacity(128);
34        inner
35            .serialize(&mut serde_json::Serializer::new(&mut bytes))
36            .map_err(|e| D::Error::custom(format!("repacking failed: {:?}", e)))?;
37
38        let extracted = T::deserialize(inner)
39            .map_err(|e| D::Error::custom(format!("extraction failed: {:?}", e)))?;
40
41        Ok(CaptureJson {
42            bytes: bytes.into_boxed_slice(),
43            inner: extracted,
44        })
45    }
46}