serde_nested_json/
de.rs

1use super::NestedJson;
2
3use serde::{
4    de::{DeserializeOwned, Visitor},
5    Deserialize, Deserializer,
6};
7use std::{
8    collections::VecDeque,
9    fmt::{Formatter, Result as FmtResult},
10    marker::PhantomData,
11};
12
13pub struct NestedJsonVisitor<T>(PhantomData<T>);
14
15pub fn unnest<'de, D: Deserializer<'de>, T: Deserialize<'de>>(d: D) -> Result<T, D::Error> {
16    d.deserialize_any(NestedJsonVisitor(PhantomData))
17}
18
19pub fn unnest_vec<'de, D: Deserializer<'de>, T: DeserializeOwned>(
20    d: D,
21) -> Result<Vec<T>, D::Error> {
22    Vec::<String>::deserialize(d)?
23        .into_iter()
24        .map(|s| serde_json::from_str(&s).map_err(serde::de::Error::custom))
25        .collect::<Result<Vec<_>, _>>()
26}
27
28impl<'de, T> Visitor<'de> for NestedJsonVisitor<T>
29where
30    T: Deserialize<'de>,
31{
32    type Value = T;
33
34    fn expecting(&self, formatter: &mut Formatter) -> FmtResult {
35        formatter.write_str("expected a string")
36    }
37
38    fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
39    where
40        E: serde::de::Error,
41    {
42        let reader = VecDeque::from(v.to_string().into_bytes());
43        let inner = Self::Value::deserialize(&mut serde_json::Deserializer::from_reader(reader))
44            .map_err(E::custom)?;
45
46        Ok(inner)
47    }
48}
49
50impl<'de, T> Deserialize<'de> for NestedJson<T>
51where
52    T: Deserialize<'de>,
53{
54    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
55    where
56        D: Deserializer<'de>,
57    {
58        let visitor = NestedJsonVisitor(PhantomData);
59        let inner = deserializer.deserialize_any(visitor)?;
60        let nested = Self(inner);
61        Ok(nested)
62    }
63}