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}