1use std::{collections::BTreeMap, marker::PhantomData};
2
3use serde::de::DeserializeSeed;
4
5pub struct Seed<'a, Q: ?Sized, T> {
10 seed: &'a Q,
11 t: PhantomData<T>,
12}
13
14impl<'a, Q: ?Sized, T> Seed<'a, Q, T> {
15 pub fn new(seed: &'a Q) -> Self {
17 Self {
18 seed,
19 t: PhantomData,
20 }
21 }
22}
23
24impl<Q: ?Sized, T> Clone for Seed<'_, Q, T> {
25 fn clone(&self) -> Self {
26 *self
27 }
28}
29
30impl<Q: ?Sized, T> Copy for Seed<'_, Q, T> {}
31
32impl<'de, Q, T> DeserializeSeed<'de> for Seed<'_, Q, T>
33where
34 Q: ?Sized,
35 T: DeserializeSeeded<'de, Q>,
36{
37 type Value = T;
38
39 fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
40 where
41 D: serde::Deserializer<'de>,
42 {
43 T::deserialize_seeded(self.seed, deserializer)
44 }
45}
46
47pub trait DeserializeSeeded<'de, Q: ?Sized>: Sized {
49 fn deserialize_seeded<D>(seed: &Q, deserializer: D) -> Result<Self, D::Error>
51 where
52 D: serde::Deserializer<'de>;
53}
54
55impl<'de, Q, T> DeserializeSeeded<'de, Q> for Box<T>
56where
57 Q: ?Sized,
58 T: DeserializeSeeded<'de, Q>,
59{
60 fn deserialize_seeded<D>(seed: &Q, deserializer: D) -> Result<Self, D::Error>
61 where
62 D: serde::Deserializer<'de>,
63 {
64 T::deserialize_seeded(seed, deserializer).map(Box::new)
65 }
66}
67
68impl<'de, Q, T> DeserializeSeeded<'de, Q> for Option<T>
69where
70 Q: ?Sized,
71 T: DeserializeSeeded<'de, Q>,
72{
73 fn deserialize_seeded<D>(seed: &Q, deserializer: D) -> Result<Self, D::Error>
74 where
75 D: serde::Deserializer<'de>,
76 {
77 struct Visitor<'seed, Q: ?Sized, T>(&'seed Q, PhantomData<T>);
78
79 impl<'de, Q, T> serde::de::Visitor<'de> for Visitor<'_, Q, T>
80 where
81 Q: ?Sized,
82 T: DeserializeSeeded<'de, Q>,
83 {
84 type Value = Option<T>;
85
86 fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
87 write!(formatter, "an optional value")
88 }
89
90 fn visit_none<E>(self) -> Result<Self::Value, E>
91 where
92 E: serde::de::Error,
93 {
94 Ok(None)
95 }
96
97 fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
98 where
99 D: serde::Deserializer<'de>,
100 {
101 T::deserialize_seeded(self.0, deserializer).map(Some)
102 }
103 }
104
105 deserializer.deserialize_option(Visitor(seed, PhantomData))
106 }
107}
108
109impl<'de, Q: ?Sized> DeserializeSeeded<'de, Q> for () {
110 fn deserialize_seeded<D>(_seed: &Q, deserializer: D) -> Result<Self, D::Error>
111 where
112 D: serde::Deserializer<'de>,
113 {
114 serde::Deserialize::deserialize(deserializer)
115 }
116}
117
118impl<'de, Q: ?Sized> DeserializeSeeded<'de, Q> for bool {
119 fn deserialize_seeded<D>(_seed: &Q, deserializer: D) -> Result<Self, D::Error>
120 where
121 D: serde::Deserializer<'de>,
122 {
123 serde::Deserialize::deserialize(deserializer)
124 }
125}
126
127impl<'de, Q: ?Sized> DeserializeSeeded<'de, Q> for u32 {
128 fn deserialize_seeded<D>(_seed: &Q, deserializer: D) -> Result<Self, D::Error>
129 where
130 D: serde::Deserializer<'de>,
131 {
132 serde::Deserialize::deserialize(deserializer)
133 }
134}
135
136impl<'de, Q: ?Sized> DeserializeSeeded<'de, Q> for String {
137 fn deserialize_seeded<D>(_seed: &Q, deserializer: D) -> Result<Self, D::Error>
138 where
139 D: serde::Deserializer<'de>,
140 {
141 serde::Deserialize::deserialize(deserializer)
142 }
143}
144
145impl<'de, Q, T> DeserializeSeeded<'de, Q> for Vec<T>
146where
147 Q: ?Sized,
148 T: DeserializeSeeded<'de, Q>,
149{
150 fn deserialize_seeded<D>(seed: &Q, deserializer: D) -> Result<Self, D::Error>
151 where
152 D: serde::Deserializer<'de>,
153 {
154 struct Visitor<'a, Q: ?Sized, T>(Seed<'a, Q, T>);
155
156 impl<'de, Q, T> serde::de::Visitor<'de> for Visitor<'_, Q, T>
157 where
158 Q: ?Sized,
159 T: DeserializeSeeded<'de, Q>,
160 {
161 type Value = Vec<T>;
162
163 fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
164 write!(formatter, "a sequence")
165 }
166
167 fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
168 where
169 A: serde::de::SeqAccess<'de>,
170 {
171 let mut result = Vec::new();
172
173 while let Some(item) = seq.next_element_seed(self.0)? {
174 result.push(item)
175 }
176
177 Ok(result)
178 }
179 }
180
181 deserializer.deserialize_seq(Visitor(Seed::new(seed)))
182 }
183}
184
185impl<'de, Q, K, V> DeserializeSeeded<'de, Q> for BTreeMap<K, V>
186where
187 Q: ?Sized,
188 K: Ord + DeserializeSeeded<'de, Q>,
189 V: DeserializeSeeded<'de, Q>,
190{
191 fn deserialize_seeded<D>(seed: &Q, deserializer: D) -> Result<Self, D::Error>
192 where
193 D: serde::Deserializer<'de>,
194 {
195 struct Visitor<'a, Q: ?Sized, K, V>(Seed<'a, Q, K>, Seed<'a, Q, V>);
196
197 impl<'de, Q, K, V> serde::de::Visitor<'de> for Visitor<'_, Q, K, V>
198 where
199 Q: ?Sized,
200 K: Ord + DeserializeSeeded<'de, Q>,
201 V: DeserializeSeeded<'de, Q>,
202 {
203 type Value = BTreeMap<K, V>;
204
205 fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
206 write!(formatter, "a sequence")
207 }
208
209 fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
210 where
211 A: serde::de::MapAccess<'de>,
212 {
213 let mut result = BTreeMap::new();
214
215 while let Some((key, value)) = map.next_entry_seed(self.0, self.1)? {
216 result.insert(key, value);
217 }
218
219 Ok(result)
220 }
221 }
222
223 deserializer.deserialize_seq(Visitor(Seed::new(seed), Seed::new(seed)))
224 }
225}