async_gemini/util/
custom_deserialize.rs

1use serde::{
2    de::{self, Deserializer, MapAccess, SeqAccess, Visitor},
3    Deserialize,
4};
5use std::fmt;
6
7pub fn deserialize_obj_or_vec<'de, T, D>(__deserializer: D) -> Result<Vec<T>, D::Error>
8where
9    T: Deserialize<'de>,
10    D: Deserializer<'de>,
11{
12    struct VecVisitor<T> {
13        marker: std::marker::PhantomData<T>,
14    }
15
16    impl<'de, T> Visitor<'de> for VecVisitor<T>
17    where
18        T: Deserialize<'de>,
19    {
20        type Value = Vec<T>;
21        fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
22            formatter.write_str("an object or array of objects")
23        }
24
25        fn visit_seq<S>(self, mut seq: S) -> Result<Self::Value, S::Error>
26        where
27            S: SeqAccess<'de>,
28        {
29            let size_hint = seq.size_hint().unwrap_or(5); // Use the hint if available, otherwise default to 0
30            let mut v = Vec::with_capacity(size_hint);
31
32            while let Some(bar) = seq.next_element()? {
33                v.push(bar);
34            }
35
36            Ok(v)
37        }
38
39        fn visit_map<M>(self, map: M) -> Result<Self::Value, M::Error>
40        where
41            M: MapAccess<'de>,
42        {
43            let bar: T = Deserialize::deserialize(de::value::MapAccessDeserializer::new(map))?;
44            Ok(vec![bar])
45        }
46    }
47    Deserializer::deserialize_any(
48        __deserializer,
49        VecVisitor {
50            marker: std::marker::PhantomData,
51        },
52    )
53}
54
55pub fn deserialize_option_obj_or_vec<'de, T, D>(
56    __deserializer: D,
57) -> Result<Option<Vec<T>>, D::Error>
58where
59    T: Deserialize<'de>,
60    D: Deserializer<'de>,
61{
62    struct VecVisitor<T> {
63        marker: std::marker::PhantomData<T>,
64    }
65
66    impl<'de, T> Visitor<'de> for VecVisitor<T>
67    where
68        T: Deserialize<'de>,
69    {
70        type Value = Option<Vec<T>>;
71        fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
72            formatter.write_str("an object, an array of objects, or null")
73        }
74
75        fn visit_seq<S>(self, mut seq: S) -> Result<Self::Value, S::Error>
76        where
77            S: SeqAccess<'de>,
78        {
79            let size_hint = seq.size_hint().unwrap_or(5); // Use the hint if available, otherwise default to 0
80            let mut v = Vec::with_capacity(size_hint);
81
82            while let Some(bar) = seq.next_element()? {
83                v.push(bar);
84            }
85
86            Ok(Some(v))
87        }
88
89        fn visit_map<M>(self, map: M) -> Result<Self::Value, M::Error>
90        where
91            M: MapAccess<'de>,
92        {
93            let bar: T = Deserialize::deserialize(de::value::MapAccessDeserializer::new(map))?;
94            Ok(Some(vec![bar])) // Wrap in a Vec if Bar is Some
95        }
96
97        // Handle null input for optional fields
98        fn visit_none<E>(self) -> Result<Self::Value, E>
99        where
100            E: de::Error,
101        {
102            Ok(None)
103        }
104    }
105    Deserializer::deserialize_any(
106        __deserializer,
107        VecVisitor {
108            marker: std::marker::PhantomData,
109        },
110    )
111}