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}