Skip to main content

yazi_shared/data/
de.rs

1use serde::{Deserializer, de::{self, Error, IntoDeserializer, MapAccess, SeqAccess}};
2
3use crate::data::{BytesDeserializer, Data, DataKey, KeyDeserializer};
4
5impl<'de> Deserializer<'de> for &'de Data {
6	type Error = de::value::Error;
7
8	fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
9	where
10		V: de::Visitor<'de>,
11	{
12		match self {
13			Data::Nil => visitor.visit_unit(),
14			Data::Boolean(b) => visitor.visit_bool(*b),
15			Data::Integer(i) => visitor.visit_i64(*i),
16			Data::Number(n) => visitor.visit_f64(*n),
17			Data::String(s) => visitor.visit_borrowed_str(s),
18			Data::List(l) => visitor.visit_seq(SeqDeserializer { iter: l.iter() }),
19			Data::Dict(d) => visitor.visit_map(MapDeserializer { iter: d.iter(), value: None }),
20			Data::Id(i) => visitor.visit_u64(i.get()),
21			Data::Url(u) => u.into_deserializer().deserialize_any(visitor),
22			Data::Path(_) => Err(Error::custom("path not supported")),
23			Data::Bytes(b) => BytesDeserializer(b.into()).deserialize_any(visitor),
24			Data::Any(_) => Err(Error::custom("any not supported")),
25		}
26	}
27
28	fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Self::Error>
29	where
30		V: de::Visitor<'de>,
31	{
32		visitor.visit_bool(self.try_into().map_err(Error::custom)?)
33	}
34
35	fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value, Self::Error>
36	where
37		V: de::Visitor<'de>,
38	{
39		visitor.visit_i8(self.try_into().map_err(Error::custom)?)
40	}
41
42	fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value, Self::Error>
43	where
44		V: de::Visitor<'de>,
45	{
46		visitor.visit_i16(self.try_into().map_err(Error::custom)?)
47	}
48
49	fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
50	where
51		V: de::Visitor<'de>,
52	{
53		visitor.visit_i32(self.try_into().map_err(Error::custom)?)
54	}
55
56	fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
57	where
58		V: de::Visitor<'de>,
59	{
60		visitor.visit_i64(self.try_into().map_err(Error::custom)?)
61	}
62
63	fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value, Self::Error>
64	where
65		V: de::Visitor<'de>,
66	{
67		visitor.visit_u8(self.try_into().map_err(Error::custom)?)
68	}
69
70	fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value, Self::Error>
71	where
72		V: de::Visitor<'de>,
73	{
74		visitor.visit_u16(self.try_into().map_err(Error::custom)?)
75	}
76
77	fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
78	where
79		V: de::Visitor<'de>,
80	{
81		visitor.visit_u32(self.try_into().map_err(Error::custom)?)
82	}
83
84	fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
85	where
86		V: de::Visitor<'de>,
87	{
88		visitor.visit_u64(self.try_into().map_err(Error::custom)?)
89	}
90
91	fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
92	where
93		V: de::Visitor<'de>,
94	{
95		visitor.visit_f32(self.try_into().map_err(Error::custom)?)
96	}
97
98	fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
99	where
100		V: de::Visitor<'de>,
101	{
102		visitor.visit_f64(self.try_into().map_err(Error::custom)?)
103	}
104
105	fn deserialize_char<V>(self, visitor: V) -> Result<V::Value, Self::Error>
106	where
107		V: de::Visitor<'de>,
108	{
109		let s: &str = self.try_into().map_err(Error::custom)?;
110		let mut chars = s.chars();
111		match (chars.next(), chars.next()) {
112			(Some(ch), None) => visitor.visit_char(ch),
113			_ => Err(Error::custom("not a char")),
114		}
115	}
116
117	fn deserialize_str<V>(self, visitor: V) -> Result<V::Value, Self::Error>
118	where
119		V: de::Visitor<'de>,
120	{
121		visitor.visit_borrowed_str(self.try_into().map_err(Error::custom)?)
122	}
123
124	fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, Self::Error>
125	where
126		V: de::Visitor<'de>,
127	{
128		match self {
129			Data::Url(u) => visitor.visit_newtype_struct(u.into_deserializer()),
130			_ => self.deserialize_str(visitor),
131		}
132	}
133
134	fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value, Self::Error>
135	where
136		V: de::Visitor<'de>,
137	{
138		match self {
139			Data::Bytes(b) => BytesDeserializer(b.into()).deserialize_bytes(visitor),
140			_ => Err(Error::custom("not bytes")),
141		}
142	}
143
144	fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value, Self::Error>
145	where
146		V: de::Visitor<'de>,
147	{
148		self.deserialize_bytes(visitor)
149	}
150
151	fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error>
152	where
153		V: de::Visitor<'de>,
154	{
155		match self {
156			Data::Nil => visitor.visit_none(),
157			_ => visitor.visit_some(self),
158		}
159	}
160
161	fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value, Self::Error>
162	where
163		V: de::Visitor<'de>,
164	{
165		match self {
166			Data::Nil => visitor.visit_unit(),
167			_ => Err(Error::custom("expected unit")),
168		}
169	}
170
171	fn deserialize_unit_struct<V>(
172		self,
173		_name: &'static str,
174		visitor: V,
175	) -> Result<V::Value, Self::Error>
176	where
177		V: de::Visitor<'de>,
178	{
179		match self {
180			Data::Nil => visitor.visit_unit(),
181			_ => Err(Error::custom("expected unit struct")),
182		}
183	}
184
185	fn deserialize_newtype_struct<V>(
186		self,
187		_name: &'static str,
188		visitor: V,
189	) -> Result<V::Value, Self::Error>
190	where
191		V: de::Visitor<'de>,
192	{
193		visitor.visit_newtype_struct(self)
194	}
195
196	fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error>
197	where
198		V: de::Visitor<'de>,
199	{
200		match self {
201			Data::List(l) => visitor.visit_seq(SeqDeserializer { iter: l.iter() }),
202			Data::Bytes(b) => BytesDeserializer(b.into()).deserialize_seq(visitor),
203			_ => Err(Error::custom("not a sequence")),
204		}
205	}
206
207	fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error>
208	where
209		V: de::Visitor<'de>,
210	{
211		self.deserialize_seq(visitor)
212	}
213
214	fn deserialize_tuple_struct<V>(
215		self,
216		_name: &'static str,
217		_len: usize,
218		visitor: V,
219	) -> Result<V::Value, Self::Error>
220	where
221		V: de::Visitor<'de>,
222	{
223		self.deserialize_seq(visitor)
224	}
225
226	fn deserialize_map<V>(self, visitor: V) -> Result<V::Value, Self::Error>
227	where
228		V: de::Visitor<'de>,
229	{
230		match self {
231			Data::Dict(d) => visitor.visit_map(MapDeserializer { iter: d.iter(), value: None }),
232			Data::Url(u) => u.into_deserializer().deserialize_map(visitor),
233			_ => Err(Error::custom("not a map")),
234		}
235	}
236
237	fn deserialize_struct<V>(
238		self,
239		_name: &'static str,
240		_fields: &'static [&'static str],
241		visitor: V,
242	) -> Result<V::Value, Self::Error>
243	where
244		V: de::Visitor<'de>,
245	{
246		self.deserialize_map(visitor)
247	}
248
249	fn deserialize_enum<V>(
250		self,
251		_name: &'static str,
252		_variants: &'static [&'static str],
253		visitor: V,
254	) -> Result<V::Value, Self::Error>
255	where
256		V: de::Visitor<'de>,
257	{
258		match self {
259			Data::String(s) => visitor.visit_enum((&**s).into_deserializer()),
260			_ => Err(Error::custom("not an enum")),
261		}
262	}
263
264	fn deserialize_identifier<V>(self, _visitor: V) -> Result<V::Value, Self::Error>
265	where
266		V: de::Visitor<'de>,
267	{
268		Err(Error::custom("identifier not supported"))
269	}
270
271	fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
272	where
273		V: de::Visitor<'de>,
274	{
275		visitor.visit_unit()
276	}
277}
278
279impl<'de> IntoDeserializer<'de, de::value::Error> for &'de Data {
280	type Deserializer = Self;
281
282	fn into_deserializer(self) -> Self::Deserializer { self }
283}
284
285// --- Seq
286struct SeqDeserializer<'a> {
287	iter: std::slice::Iter<'a, Data>,
288}
289
290impl<'de> SeqAccess<'de> for SeqDeserializer<'de> {
291	type Error = de::value::Error;
292
293	fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
294	where
295		T: de::DeserializeSeed<'de>,
296	{
297		self.iter.next().map(|value| seed.deserialize(value)).transpose()
298	}
299
300	fn size_hint(&self) -> Option<usize> { Some(self.iter.len()) }
301}
302
303// --- Map
304struct MapDeserializer<'a> {
305	iter:  hashbrown::hash_map::Iter<'a, DataKey, Data>,
306	value: Option<&'a Data>,
307}
308
309impl<'de> MapAccess<'de> for MapDeserializer<'de> {
310	type Error = de::value::Error;
311
312	fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Self::Error>
313	where
314		K: de::DeserializeSeed<'de>,
315	{
316		let Some((key, value)) = self.iter.next() else { return Ok(None) };
317		self.value = Some(value);
318
319		seed.deserialize(KeyDeserializer::Borrowed(key)).map(Some)
320	}
321
322	fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Self::Error>
323	where
324		V: de::DeserializeSeed<'de>,
325	{
326		seed.deserialize(self.value.take().ok_or_else(|| Error::custom("value missing for key"))?)
327	}
328
329	fn size_hint(&self) -> Option<usize> { Some(self.iter.len()) }
330}