async_gemini/util/
custom_deserialize.rs1use 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); 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); 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])) }
96
97 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}