serde_seeded/
de.rs

1use std::{collections::BTreeMap, marker::PhantomData};
2
3use serde::de::DeserializeSeed;
4
5/// Seed deserializing any `T` implementing `DeserializeSeeded<Q>`.
6///
7/// This type implements [`DeserializeSeed`] when `T` implements
8/// [`DeserializeSeeded<Q>`].
9pub 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	/// Creates a new deserializing seed.
16	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
47/// A data structure that can be deserialized with a seed of type `Q`.
48pub trait DeserializeSeeded<'de, Q: ?Sized>: Sized {
49	/// Deserializes `Self` using the given seed and deserializer.
50	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}