1use std::fmt;
2use std::hash::Hash;
3use std::marker::PhantomData;
4
5use serde::de::value::{
6 MapAccessDeserializer, MapDeserializer, SeqAccessDeserializer, StrDeserializer,
7 StringDeserializer,
8};
9use serde::de::{self, IntoDeserializer, SeqAccess, Visitor};
10use serde::{forward_to_deserialize_any, Deserialize, Deserializer};
11
12use super::Error;
13use crate::conv::{i8_vec_into_u8_vec, u8_slice_as_i8_slice, u8_vec_into_i8_vec};
14use crate::{Compound, List, Value};
15
16impl<'de, S> Deserialize<'de> for Value<S>
17where
18 S: Deserialize<'de> + Ord + Hash,
19{
20 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
21 where
22 D: Deserializer<'de>,
23 {
24 struct ValueVisitor<S>(PhantomData<S>);
25
26 impl<'de, S> Visitor<'de> for ValueVisitor<S>
27 where
28 S: Deserialize<'de> + Ord + Hash,
29 {
30 type Value = Value<S>;
31
32 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
33 write!(formatter, "a valid NBT type")
34 }
35
36 fn visit_bool<E>(self, v: bool) -> Result<Self::Value, E>
37 where
38 E: de::Error,
39 {
40 Ok(Value::Byte(v.into()))
41 }
42
43 fn visit_i8<E>(self, v: i8) -> Result<Self::Value, E>
44 where
45 E: de::Error,
46 {
47 Ok(Value::Byte(v))
48 }
49
50 fn visit_i16<E>(self, v: i16) -> Result<Self::Value, E>
51 where
52 E: de::Error,
53 {
54 Ok(Value::Short(v))
55 }
56
57 fn visit_i32<E>(self, v: i32) -> Result<Self::Value, E>
58 where
59 E: de::Error,
60 {
61 Ok(Value::Int(v))
62 }
63
64 fn visit_i64<E>(self, v: i64) -> Result<Self::Value, E>
65 where
66 E: de::Error,
67 {
68 Ok(Value::Long(v))
69 }
70
71 fn visit_u8<E>(self, v: u8) -> Result<Self::Value, E>
72 where
73 E: de::Error,
74 {
75 Ok(Value::Byte(v as i8))
76 }
77
78 fn visit_u16<E>(self, v: u16) -> Result<Self::Value, E>
79 where
80 E: de::Error,
81 {
82 Ok(Value::Short(v as i16))
83 }
84
85 fn visit_u32<E>(self, v: u32) -> Result<Self::Value, E>
86 where
87 E: de::Error,
88 {
89 Ok(Value::Int(v as i32))
90 }
91
92 fn visit_u64<E>(self, v: u64) -> Result<Self::Value, E>
93 where
94 E: de::Error,
95 {
96 Ok(Value::Long(v as i64))
97 }
98
99 fn visit_f32<E>(self, v: f32) -> Result<Self::Value, E>
100 where
101 E: de::Error,
102 {
103 Ok(Value::Float(v))
104 }
105
106 fn visit_f64<E>(self, v: f64) -> Result<Self::Value, E>
107 where
108 E: de::Error,
109 {
110 Ok(Value::Double(v))
111 }
112
113 fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
114 where
115 E: de::Error,
116 {
117 S::deserialize(StrDeserializer::new(v)).map(Value::String)
118 }
119
120 fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
121 where
122 E: de::Error,
123 {
124 S::deserialize(StringDeserializer::new(v)).map(Value::String)
125 }
126
127 fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
128 where
129 E: de::Error,
130 {
131 Ok(Value::ByteArray(u8_slice_as_i8_slice(v).into()))
132 }
133
134 fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E>
135 where
136 E: de::Error,
137 {
138 Ok(Value::ByteArray(u8_vec_into_i8_vec(v)))
139 }
140
141 fn visit_seq<A>(self, seq: A) -> Result<Self::Value, A::Error>
142 where
143 A: de::SeqAccess<'de>,
144 {
145 Ok(List::deserialize(SeqAccessDeserializer::new(seq))?.into())
146 }
147
148 fn visit_map<A>(self, map: A) -> Result<Self::Value, A::Error>
149 where
150 A: de::MapAccess<'de>,
151 {
152 Ok(Compound::deserialize(MapAccessDeserializer::new(map))?.into())
153 }
154 }
155
156 deserializer.deserialize_any(ValueVisitor::<S>(PhantomData))
157 }
158}
159
160impl<'de, S> Deserialize<'de> for List<S>
161where
162 S: Deserialize<'de> + Ord + Hash,
163{
164 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
165 where
166 D: Deserializer<'de>,
167 {
168 struct ListVisitor<S>(PhantomData<S>);
169
170 impl<'de, S> Visitor<'de> for ListVisitor<S>
171 where
172 S: Deserialize<'de> + Ord + Hash,
173 {
174 type Value = List<S>;
175
176 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
177 write!(formatter, "a sequence or bytes")
178 }
179
180 fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
181 where
182 A: de::SeqAccess<'de>,
183 {
184 match seq.next_element::<Value<S>>()? {
185 Some(v) => match v {
186 Value::Byte(v) => deserialize_seq_remainder(v, seq, From::from),
187 Value::Short(v) => deserialize_seq_remainder(v, seq, From::from),
188 Value::Int(v) => deserialize_seq_remainder(v, seq, From::from),
189 Value::Long(v) => deserialize_seq_remainder(v, seq, From::from),
190 Value::Float(v) => deserialize_seq_remainder(v, seq, From::from),
191 Value::Double(v) => deserialize_seq_remainder(v, seq, From::from),
192 Value::ByteArray(v) => deserialize_seq_remainder(v, seq, From::from),
193 Value::String(v) => deserialize_seq_remainder(v, seq, List::String),
194 Value::List(v) => deserialize_seq_remainder(v, seq, From::from),
195 Value::Compound(v) => deserialize_seq_remainder(v, seq, From::from),
196 Value::IntArray(v) => deserialize_seq_remainder(v, seq, From::from),
197 Value::LongArray(v) => deserialize_seq_remainder(v, seq, From::from),
198 },
199 None => Ok(List::End),
200 }
201 }
202
203 fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E>
204 where
205 E: de::Error,
206 {
207 Ok(List::Byte(u8_vec_into_i8_vec(v)))
208 }
209
210 fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
211 where
212 E: de::Error,
213 {
214 Ok(List::Byte(u8_slice_as_i8_slice(v).into()))
215 }
216 }
217
218 deserializer.deserialize_seq(ListVisitor::<S>(PhantomData))
219 }
220}
221
222fn deserialize_seq_remainder<'de, T, A, S, C>(
225 first: T,
226 mut seq: A,
227 conv: C,
228) -> Result<List<S>, A::Error>
229where
230 T: Deserialize<'de>,
231 A: de::SeqAccess<'de>,
232 C: FnOnce(Vec<T>) -> List<S>,
233{
234 let mut vec = match seq.size_hint() {
235 Some(n) => Vec::with_capacity(n + 1),
236 None => Vec::new(),
237 };
238
239 vec.push(first);
240
241 while let Some(v) = seq.next_element()? {
242 vec.push(v);
243 }
244
245 Ok(conv(vec))
246}
247
248impl<'de> Deserializer<'de> for Compound {
249 type Error = Error;
250
251 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
252 where
253 V: Visitor<'de>,
254 {
255 visitor.visit_map(MapDeserializer::new(self.into_iter()))
256 }
257
258 forward_to_deserialize_any! {
259 bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
260 bytes byte_buf option unit unit_struct newtype_struct seq tuple
261 tuple_struct map struct enum identifier ignored_any
262 }
263}
264
265impl IntoDeserializer<'_, Error> for Compound {
266 type Deserializer = Self;
267
268 fn into_deserializer(self) -> Self::Deserializer {
269 self
270 }
271}
272
273impl<'de> Deserializer<'de> for Value {
274 type Error = Error;
275
276 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
277 where
278 V: Visitor<'de>,
279 {
280 match self {
281 Value::Byte(v) => visitor.visit_i8(v),
282 Value::Short(v) => visitor.visit_i16(v),
283 Value::Int(v) => visitor.visit_i32(v),
284 Value::Long(v) => visitor.visit_i64(v),
285 Value::Float(v) => visitor.visit_f32(v),
286 Value::Double(v) => visitor.visit_f64(v),
287 Value::ByteArray(v) => visitor.visit_byte_buf(i8_vec_into_u8_vec(v)),
288 Value::String(v) => visitor.visit_string(v),
289 Value::List(v) => v.deserialize_any(visitor),
290 Value::Compound(v) => v.into_deserializer().deserialize_any(visitor),
291 Value::IntArray(v) => v.into_deserializer().deserialize_any(visitor),
292 Value::LongArray(v) => v.into_deserializer().deserialize_any(visitor),
293 }
294 }
295
296 fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Self::Error>
297 where
298 V: Visitor<'de>,
299 {
300 match self {
301 Value::Byte(b) => visitor.visit_bool(b != 0),
302 _ => self.deserialize_any(visitor),
303 }
304 }
305
306 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error>
307 where
308 V: Visitor<'de>,
309 {
310 visitor.visit_some(self)
311 }
312
313 fn deserialize_enum<V>(
314 self,
315 _name: &'static str,
316 _variants: &'static [&'static str],
317 visitor: V,
318 ) -> Result<V::Value, Self::Error>
319 where
320 V: Visitor<'de>,
321 {
322 match self {
323 Value::String(s) => visitor.visit_enum(s.into_deserializer()), other => other.deserialize_any(visitor),
325 }
326 }
327
328 forward_to_deserialize_any! {
329 i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
330 bytes byte_buf unit unit_struct newtype_struct seq tuple
331 tuple_struct map struct identifier ignored_any
332 }
333}
334
335impl IntoDeserializer<'_, Error> for Value {
336 type Deserializer = Self;
337
338 fn into_deserializer(self) -> Self::Deserializer {
339 self
340 }
341}
342
343impl<'de> Deserializer<'de> for List {
344 type Error = Error;
345
346 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
347 where
348 V: Visitor<'de>,
349 {
350 struct EndSeqAccess;
351
352 impl<'de> SeqAccess<'de> for EndSeqAccess {
353 type Error = Error;
354
355 fn next_element_seed<T>(&mut self, _seed: T) -> Result<Option<T::Value>, Self::Error>
356 where
357 T: de::DeserializeSeed<'de>,
358 {
359 Ok(None)
360 }
361 }
362
363 match self {
364 List::End => visitor.visit_seq(EndSeqAccess),
365 List::Byte(v) => visitor.visit_byte_buf(i8_vec_into_u8_vec(v)),
366 List::Short(v) => v.into_deserializer().deserialize_any(visitor),
367 List::Int(v) => v.into_deserializer().deserialize_any(visitor),
368 List::Long(v) => v.into_deserializer().deserialize_any(visitor),
369 List::Float(v) => v.into_deserializer().deserialize_any(visitor),
370 List::Double(v) => v.into_deserializer().deserialize_any(visitor),
371 List::ByteArray(v) => v.into_deserializer().deserialize_any(visitor),
372 List::String(v) => v.into_deserializer().deserialize_any(visitor),
373 List::List(v) => v.into_deserializer().deserialize_any(visitor),
374 List::Compound(v) => v.into_deserializer().deserialize_any(visitor),
375 List::IntArray(v) => v.into_deserializer().deserialize_any(visitor),
376 List::LongArray(v) => v.into_deserializer().deserialize_any(visitor),
377 }
378 }
379
380 forward_to_deserialize_any! {
381 bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
382 bytes byte_buf option unit unit_struct newtype_struct seq tuple
383 tuple_struct map struct enum identifier ignored_any
384 }
385}
386
387impl IntoDeserializer<'_, Error> for List {
388 type Deserializer = Self;
389
390 fn into_deserializer(self) -> Self::Deserializer {
391 self
392 }
393}