1use base64::prelude::BASE64_STANDARD;
2use base64::Engine;
3use core::{fmt, slice};
4use std::iter::Peekable;
5
6use serde::de::value::SeqDeserializer;
7use serde::de::{self, Deserializer as _, IntoDeserializer};
8
9use crate::{Error, Value};
10
11impl<'a> From<&'a Value> for de::Unexpected<'a> {
12 fn from(value: &'a Value) -> Self {
13 match value {
14 Value::Bool(x) => Self::Bool(*x),
15 Value::Float(x) => Self::Float(*x),
16 Value::Bytes(x) => Self::Bytes(x),
17 Value::Text(x) => Self::Str(x),
18 Value::Array(..) => Self::Seq,
19 Value::Map(..) => Self::Map,
20 Value::Null => Self::Other("null"),
21 Value::U128(_x) => todo!(), Value::I128(_x) => todo!(), Value::U64(x) => Self::Unsigned(*x),
24 Value::I64(x) => Self::Signed(*x),
25 Value::U32(x) => Self::Unsigned(*x as u64),
26 Value::I32(x) => Self::Signed(*x as i64),
27 Value::U16(x) => Self::Unsigned(*x as u64),
28 Value::I16(x) => Self::Signed(*x as i64),
29 Value::U8(x) => Self::Unsigned(*x as u64),
30 Value::I8(x) => Self::Signed(*x as i64),
31 Value::Bytes20(x) => Self::Bytes(x),
32 Value::Bytes32(x) => Self::Bytes(x),
33 Value::Bytes36(x) => Self::Bytes(x),
34 Value::EnumU8(_x) => todo!(),
35 Value::EnumString(_x) => todo!(),
36 Value::Identifier(x) => Self::Bytes(x),
37 }
38 }
39}
40
41macro_rules! mkvisit {
42 ($($f:ident($v:ty)),+ $(,)?) => {
43 $(
44 fn $f<E: de::Error>(self, v: $v) -> Result<Self::Value, E> {
45 Ok(v.into())
46 }
47 )+
48 };
49}
50
51struct Visitor;
52
53impl<'de> de::Visitor<'de> for Visitor {
54 type Value = Value;
55
56 fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
57 write!(formatter, "a valid platform value item")
58 }
59
60 mkvisit! {
61 visit_bool(bool),
62 visit_f32(f32),
63 visit_f64(f64),
64
65 visit_i8(i8),
66 visit_i16(i16),
67 visit_i32(i32),
68 visit_i64(i64),
69 visit_i128(i128),
70
71 visit_u8(u8),
72 visit_u16(u16),
73 visit_u32(u32),
74 visit_u64(u64),
75 visit_u128(u128),
76
77 visit_char(char),
78 visit_str(&str),
79 visit_borrowed_str(&'de str),
80 visit_string(String),
81
82 visit_bytes(&[u8]),
83 visit_borrowed_bytes(&'de [u8]),
84 visit_byte_buf(Vec<u8>),
85 }
86
87 fn visit_none<E: de::Error>(self) -> Result<Self::Value, E> {
88 Ok(Value::Null)
89 }
90
91 fn visit_some<D: de::Deserializer<'de>>(
92 self,
93 deserializer: D,
94 ) -> Result<Self::Value, D::Error> {
95 deserializer.deserialize_any(self)
96 }
97
98 fn visit_unit<E: de::Error>(self) -> Result<Self::Value, E> {
99 Ok(Value::Null)
100 }
101
102 fn visit_newtype_struct<D: de::Deserializer<'de>>(
103 self,
104 deserializer: D,
105 ) -> Result<Self::Value, D::Error> {
106 deserializer.deserialize_any(self)
107 }
108
109 fn visit_seq<A: de::SeqAccess<'de>>(self, mut acc: A) -> Result<Self::Value, A::Error> {
110 let mut seq = Vec::new();
111
112 while let Some(elem) = acc.next_element()? {
113 seq.push(elem);
114 }
115
116 Ok(Value::Array(seq))
117 }
118
119 fn visit_map<A: de::MapAccess<'de>>(self, mut acc: A) -> Result<Self::Value, A::Error> {
120 let mut map = Vec::<(Value, Value)>::new();
121
122 while let Some(kv) = acc.next_entry()? {
123 map.push(kv);
124 }
125
126 Ok(Value::Map(map))
127 }
128
129 fn visit_enum<A: de::EnumAccess<'de>>(self, acc: A) -> Result<Self::Value, A::Error> {
130 use serde::de::VariantAccess;
131 struct Inner;
132 impl<'de> de::Visitor<'de> for Inner {
133 type Value = Value;
134 fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
135 write!(formatter, "a valid CBOR item")
136 }
137 fn visit_seq<A: de::SeqAccess<'de>>(self, mut acc: A) -> Result<Self::Value, A::Error> {
138 match acc.size_hint() {
139 Some(1) => {
140 let tag: u8 = acc
141 .next_element()?
142 .ok_or_else(|| de::Error::custom("expected tag"))?;
143 Ok(Value::EnumU8(vec![tag]))
144 }
145 _ => {
146 let val: Vec<String> = de::Deserialize::deserialize(
147 de::value::SeqAccessDeserializer::new(acc),
148 )?;
149 Ok(Value::EnumString(val))
150 }
151 }
152 }
153 }
154 let (name, data): (String, _) = acc.variant()?;
155 if name == "@@TAGGED@@" {
156 data.tuple_variant(2, Inner)
157 } else {
158 Err(de::Error::custom(format!(
159 "Unexpected variant name: {}",
160 name
161 )))
162 }
163 }
164}
165
166impl<'de> de::Deserialize<'de> for Value {
167 fn deserialize<D: de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
168 deserializer.deserialize_any(Visitor)
169 }
170}
171
172pub(crate) struct Deserializer<T>(pub(crate) T);
173
174impl<'de> de::Deserializer<'de> for Deserializer<Value> {
175 type Error = Error;
176
177 fn deserialize_any<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> {
178 let human_readable = self.is_human_readable();
179 match self.0 {
180 Value::Bytes(x) => {
181 if human_readable {
182 visitor.visit_str(BASE64_STANDARD.encode(x).as_str())
183 } else {
184 visitor.visit_bytes(&x)
185 }
186 }
187 Value::Text(x) => visitor.visit_str(&x),
188 Value::Array(x) => visitor.visit_seq(ArrayDeserializer(x.iter())),
189 Value::Map(x) => visitor.visit_map(ValueMapDeserializer(x.iter().peekable())),
190 Value::Bool(x) => visitor.visit_bool(x),
191 Value::Null => visitor.visit_none(),
192 Value::Float(x) => visitor.visit_f64(x),
193 Value::U128(x) => visitor.visit_u128(x),
194 Value::I128(x) => visitor.visit_i128(x),
195 Value::U64(x) => visitor.visit_u64(x),
196 Value::I64(x) => visitor.visit_i64(x),
197 Value::U32(x) => visitor.visit_u32(x),
198 Value::I32(x) => visitor.visit_i32(x),
199 Value::U16(x) => visitor.visit_u16(x),
200 Value::I16(x) => visitor.visit_i16(x),
201 Value::U8(x) => visitor.visit_u8(x),
202 Value::I8(x) => visitor.visit_i8(x),
203 Value::Bytes20(x) => {
204 if human_readable {
205 visitor.visit_str(BASE64_STANDARD.encode(x).as_str())
206 } else {
207 visitor.visit_bytes(&x)
208 }
209 }
210 Value::Bytes32(x) => {
211 if human_readable {
212 visitor.visit_str(BASE64_STANDARD.encode(x).as_str())
213 } else {
214 visitor.visit_bytes(&x)
215 }
216 }
217 Value::Bytes36(x) => {
218 if human_readable {
219 visitor.visit_str(BASE64_STANDARD.encode(x).as_str())
220 } else {
221 visitor.visit_bytes(&x)
222 }
223 }
224 Value::EnumU8(x) => visitor.visit_seq(SeqDeserializer::new(x.into_iter())),
225 Value::EnumString(x) => visitor.visit_seq(SeqDeserializer::new(x.into_iter())),
226 Value::Identifier(x) => {
227 if human_readable {
228 visitor.visit_str(bs58::encode(x).into_string().as_str())
229 } else {
230 visitor.visit_bytes(&x)
231 }
232 }
233 }
234 }
235
236 fn deserialize_bool<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> {
237 let value = self.0;
238
239 match value {
240 Value::Bool(x) => visitor.visit_bool(x),
241 _ => Err(de::Error::invalid_type((&value).into(), &"bool")),
242 }
243 }
244
245 fn deserialize_f32<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> {
246 self.deserialize_f64(visitor)
247 }
248
249 fn deserialize_f64<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> {
250 let value = self.0;
251
252 match value {
253 Value::Float(x) => visitor.visit_f64(x),
254 _ => Err(de::Error::invalid_type((&value).into(), &"f64")),
255 }
256 }
257
258 fn deserialize_i8<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> {
259 let value = self.0;
260 visitor.visit_i8(value.to_integer()?)
261 }
262
263 fn deserialize_i16<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> {
264 let value = self.0;
265 visitor.visit_i16(value.to_integer()?)
266 }
267
268 fn deserialize_i32<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> {
269 let value = self.0;
270 visitor.visit_i32(value.to_integer()?)
271 }
272
273 fn deserialize_i64<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> {
274 let value = self.0;
275 visitor.visit_i64(value.to_integer()?)
276 }
277
278 fn deserialize_i128<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> {
279 let value = self.0;
280 visitor.visit_i128(value.to_integer()?)
281 }
282
283 fn deserialize_u8<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> {
284 let value = self.0;
285 visitor.visit_u8(value.to_integer()?)
286 }
287
288 fn deserialize_u16<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> {
289 let value = self.0;
290 visitor.visit_u16(value.to_integer()?)
291 }
292
293 fn deserialize_u32<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> {
294 let value = self.0;
295 visitor.visit_u32(value.to_integer()?)
296 }
297
298 fn deserialize_u64<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> {
299 let value = self.0;
300 visitor.visit_u64(value.to_integer()?)
301 }
302
303 fn deserialize_u128<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> {
304 let value = self.0;
305 visitor.visit_u128(value.to_integer()?)
306 }
307
308 fn deserialize_char<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> {
309 let value = self.0;
310
311 match value {
312 Value::Text(ref x) => match x.chars().count() {
313 1 => visitor.visit_char(x.chars().next().unwrap()),
314 _ => Err(de::Error::invalid_type((&value).into(), &"char")),
315 },
316
317 _ => Err(de::Error::invalid_type((&value).into(), &"char")),
318 }
319 }
320
321 fn deserialize_str<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> {
322 let value = self.0;
323
324 match value {
325 Value::Text(x) => visitor.visit_str(&x),
326 _ => Err(de::Error::invalid_type((&value).into(), &"str")),
327 }
328 }
329
330 fn deserialize_string<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> {
331 self.deserialize_str(visitor)
332 }
333
334 fn deserialize_bytes<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> {
335 let value = self.0;
336
337 match value {
338 Value::Bytes(x) => visitor.visit_bytes(&x),
339 Value::Bytes20(x) => visitor.visit_bytes(x.as_slice()),
340 Value::Bytes32(x) => visitor.visit_bytes(x.as_slice()),
341 Value::Bytes36(x) => visitor.visit_bytes(x.as_slice()),
342 Value::Identifier(x) => visitor.visit_bytes(x.as_slice()),
343 _ => Err(de::Error::invalid_type((&value).into(), &"bytes")),
344 }
345 }
346
347 fn deserialize_byte_buf<V: de::Visitor<'de>>(
348 self,
349 visitor: V,
350 ) -> Result<V::Value, Self::Error> {
351 self.deserialize_bytes(visitor)
352 }
353
354 fn deserialize_seq<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> {
355 let value = self.0;
356
357 match value {
358 Value::Array(x) => visitor.visit_seq(ArrayDeserializer(x.iter())),
359 _ => Err(de::Error::invalid_type((&value).into(), &"array")),
360 }
361 }
362
363 fn deserialize_map<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> {
364 let value = self.0;
365
366 match value {
367 Value::Map(x) => visitor.visit_map(ValueMapDeserializer(x.iter().peekable())),
368 _ => Err(de::Error::invalid_type((&value).into(), &"map")),
369 }
370 }
371
372 fn deserialize_struct<V: de::Visitor<'de>>(
373 self,
374 _name: &'static str,
375 _fields: &'static [&'static str],
376 visitor: V,
377 ) -> Result<V::Value, Self::Error> {
378 self.deserialize_map(visitor)
379 }
380
381 fn deserialize_tuple<V: de::Visitor<'de>>(
382 self,
383 _len: usize,
384 visitor: V,
385 ) -> Result<V::Value, Self::Error> {
386 self.deserialize_seq(visitor)
387 }
388
389 fn deserialize_tuple_struct<V: de::Visitor<'de>>(
390 self,
391 _name: &'static str,
392 _len: usize,
393 visitor: V,
394 ) -> Result<V::Value, Self::Error> {
395 self.deserialize_seq(visitor)
396 }
397
398 fn deserialize_identifier<V: de::Visitor<'de>>(
399 self,
400 visitor: V,
401 ) -> Result<V::Value, Self::Error> {
402 self.deserialize_str(visitor)
403 }
404
405 fn deserialize_ignored_any<V: de::Visitor<'de>>(
406 self,
407 visitor: V,
408 ) -> Result<V::Value, Self::Error> {
409 self.deserialize_any(visitor)
410 }
411
412 fn deserialize_option<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> {
413 match self.0 {
414 Value::Null => visitor.visit_none(),
415 x => visitor.visit_some(Self(x)),
416 }
417 }
418
419 fn deserialize_unit<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> {
420 match self.0 {
421 Value::Null => visitor.visit_unit(),
422 _ => Err(de::Error::invalid_type((&self.0).into(), &"null")),
423 }
424 }
425
426 fn deserialize_unit_struct<V: de::Visitor<'de>>(
427 self,
428 _name: &'static str,
429 visitor: V,
430 ) -> Result<V::Value, Self::Error> {
431 self.deserialize_unit(visitor)
432 }
433
434 fn deserialize_newtype_struct<V: de::Visitor<'de>>(
435 self,
436 _name: &'static str,
437 visitor: V,
438 ) -> Result<V::Value, Self::Error> {
439 visitor.visit_newtype_struct(self)
440 }
441
442 fn deserialize_enum<V: de::Visitor<'de>>(
443 self,
444 _name: &'static str,
445 _variants: &'static [&'static str],
446 visitor: V,
447 ) -> Result<V::Value, Self::Error> {
448 match self.0 {
449 Value::EnumU8(x) => {
451 let enum_variant = x.first().ok_or_else(|| {
452 de::Error::invalid_length(0, &"at least one variant expected")
453 })?;
454 let variant_name = format!("Variant{}", enum_variant);
455 visitor.visit_enum(variant_name.into_deserializer())
456 }
457 Value::EnumString(x) => {
458 let variant_name = x
459 .first()
460 .ok_or_else(|| de::Error::invalid_length(0, &"at least one variant expected"))?
461 .clone();
462 visitor.visit_enum(variant_name.into_deserializer())
463 }
464
465 Value::Text(variant) => visitor.visit_enum(ValueEnumDeserializer {
467 variant,
468 value: None,
469 }),
470
471 Value::Map(entries) if entries.len() == 1 => {
474 let (key, value) = entries
475 .into_iter()
476 .next()
477 .expect("guard guarantees len == 1");
478 let variant = match key {
479 Value::Text(s) => s,
480 other => {
481 return Err(de::Error::invalid_type(
482 (&other).into(),
483 &"string variant name",
484 ))
485 }
486 };
487 visitor.visit_enum(ValueEnumDeserializer {
488 variant,
489 value: Some(value),
490 })
491 }
492
493 other => Err(de::Error::invalid_type((&other).into(), &"enum")),
494 }
495 }
496
497 fn is_human_readable(&self) -> bool {
498 false
499 }
500}
501
502struct ArrayDeserializer<'a>(slice::Iter<'a, Value>);
503
504impl<'de> de::SeqAccess<'de> for ArrayDeserializer<'_> {
505 type Error = Error;
506
507 fn next_element_seed<U: de::DeserializeSeed<'de>>(
508 &mut self,
509 seed: U,
510 ) -> Result<Option<U::Value>, Self::Error> {
511 self.0
512 .next()
513 .map(|x| seed.deserialize(Deserializer(x.clone())))
514 .transpose() }
516}
517
518struct ValueMapDeserializer<'a>(Peekable<slice::Iter<'a, (Value, Value)>>);
519
520impl<'de> de::MapAccess<'de> for ValueMapDeserializer<'_> {
521 type Error = Error;
522
523 fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Self::Error>
524 where
525 K: de::DeserializeSeed<'de>,
526 {
527 self.0
530 .peek()
531 .map(|x| seed.deserialize(Deserializer(x.0.clone()))) .transpose()
533 }
534
535 fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Self::Error>
536 where
537 V: de::DeserializeSeed<'de>,
538 {
539 let map_value = self
540 .0
541 .next()
542 .expect("`next_key_seed` must be called first")
543 .1
544 .clone(); seed.deserialize(Deserializer(map_value))
546 }
547}
548
549struct ValueEnumDeserializer {
551 variant: String,
552 value: Option<Value>,
553}
554
555impl<'de> de::EnumAccess<'de> for ValueEnumDeserializer {
556 type Error = Error;
557 type Variant = ValueVariantDeserializer;
558
559 fn variant_seed<V: de::DeserializeSeed<'de>>(
560 self,
561 seed: V,
562 ) -> Result<(V::Value, Self::Variant), Self::Error> {
563 let variant = seed.deserialize(self.variant.into_deserializer())?;
564 Ok((variant, ValueVariantDeserializer { value: self.value }))
565 }
566}
567
568struct ValueVariantDeserializer {
570 value: Option<Value>,
571}
572
573impl<'de> de::VariantAccess<'de> for ValueVariantDeserializer {
574 type Error = Error;
575
576 fn unit_variant(self) -> Result<(), Self::Error> {
577 match self.value {
578 None => Ok(()),
579 Some(Value::Null) => Ok(()),
580 Some(other) => Err(de::Error::invalid_type((&other).into(), &"unit variant")),
581 }
582 }
583
584 fn newtype_variant_seed<T: de::DeserializeSeed<'de>>(
585 self,
586 seed: T,
587 ) -> Result<T::Value, Self::Error> {
588 match self.value {
589 Some(value) => seed.deserialize(Deserializer(value)),
590 None => Err(de::Error::invalid_type(
591 de::Unexpected::UnitVariant,
592 &"newtype variant",
593 )),
594 }
595 }
596
597 fn tuple_variant<V: de::Visitor<'de>>(
598 self,
599 _len: usize,
600 visitor: V,
601 ) -> Result<V::Value, Self::Error> {
602 match self.value {
603 Some(value) => Deserializer(value).deserialize_seq(visitor),
604 None => Err(de::Error::invalid_type(
605 de::Unexpected::UnitVariant,
606 &"tuple variant",
607 )),
608 }
609 }
610
611 fn struct_variant<V: de::Visitor<'de>>(
612 self,
613 _fields: &'static [&'static str],
614 visitor: V,
615 ) -> Result<V::Value, Self::Error> {
616 match self.value {
617 Some(value) => Deserializer(value).deserialize_map(visitor),
618 None => Err(de::Error::invalid_type(
619 de::Unexpected::UnitVariant,
620 &"struct variant",
621 )),
622 }
623 }
624}
625
626impl<'de> de::VariantAccess<'de> for Deserializer<Value> {
627 type Error = Error;
628
629 fn unit_variant(self) -> Result<(), Self::Error> {
630 match self.0 {
631 Value::Null => Ok(()),
632 v => Err(de::Error::invalid_type((&v).into(), &"unit")),
633 }
634 }
635
636 fn newtype_variant_seed<U: de::DeserializeSeed<'de>>(
637 self,
638 seed: U,
639 ) -> Result<U::Value, Self::Error> {
640 seed.deserialize(self)
641 }
642
643 fn tuple_variant<V: de::Visitor<'de>>(
644 self,
645 _len: usize,
646 visitor: V,
647 ) -> Result<V::Value, Self::Error> {
648 self.deserialize_seq(visitor)
649 }
650
651 fn struct_variant<V: de::Visitor<'de>>(
652 self,
653 _fields: &'static [&'static str],
654 visitor: V,
655 ) -> Result<V::Value, Self::Error> {
656 self.deserialize_map(visitor)
657 }
658}
659
660#[cfg(test)]
661mod tests {
662 use super::*;
663 use crate::{from_value, to_value};
664 use serde::{Deserialize, Serialize};
665
666 #[test]
671 fn deserialize_bool() {
672 let val = Value::Bool(true);
673 let result: bool = from_value(val).unwrap();
674 assert!(result);
675 }
676
677 #[test]
678 fn deserialize_u8() {
679 let val = Value::U8(42);
680 let result: u8 = from_value(val).unwrap();
681 assert_eq!(result, 42);
682 }
683
684 #[test]
685 fn deserialize_u16() {
686 let val = Value::U16(1000);
687 let result: u16 = from_value(val).unwrap();
688 assert_eq!(result, 1000);
689 }
690
691 #[test]
692 fn deserialize_u32() {
693 let val = Value::U32(100_000);
694 let result: u32 = from_value(val).unwrap();
695 assert_eq!(result, 100_000);
696 }
697
698 #[test]
699 fn deserialize_u64() {
700 let val = Value::U64(10_000_000_000);
701 let result: u64 = from_value(val).unwrap();
702 assert_eq!(result, 10_000_000_000);
703 }
704
705 #[test]
706 fn deserialize_u128() {
707 let val = Value::U128(u128::MAX);
708 let result: u128 = from_value(val).unwrap();
709 assert_eq!(result, u128::MAX);
710 }
711
712 #[test]
713 fn deserialize_i8() {
714 let val = Value::I8(-42);
715 let result: i8 = from_value(val).unwrap();
716 assert_eq!(result, -42);
717 }
718
719 #[test]
720 fn deserialize_i16() {
721 let val = Value::I16(-1000);
722 let result: i16 = from_value(val).unwrap();
723 assert_eq!(result, -1000);
724 }
725
726 #[test]
727 fn deserialize_i32() {
728 let val = Value::I32(-100_000);
729 let result: i32 = from_value(val).unwrap();
730 assert_eq!(result, -100_000);
731 }
732
733 #[test]
734 fn deserialize_i64() {
735 let val = Value::I64(-10_000_000_000);
736 let result: i64 = from_value(val).unwrap();
737 assert_eq!(result, -10_000_000_000);
738 }
739
740 #[test]
741 fn deserialize_i128() {
742 let val = Value::I128(i128::MIN);
743 let result: i128 = from_value(val).unwrap();
744 assert_eq!(result, i128::MIN);
745 }
746
747 #[test]
748 fn deserialize_f64() {
749 let val = Value::Float(3.14);
750 let result: f64 = from_value(val).unwrap();
751 assert!((result - 3.14).abs() < f64::EPSILON);
752 }
753
754 #[test]
755 fn deserialize_string() {
756 let val = Value::Text("hello".into());
757 let result: String = from_value(val).unwrap();
758 assert_eq!(result, "hello");
759 }
760
761 #[test]
762 fn deserialize_null_as_option_none() {
763 let val = Value::Null;
764 let result: Option<String> = from_value(val).unwrap();
765 assert_eq!(result, None);
766 }
767
768 #[test]
769 fn deserialize_some_as_option_some() {
770 let val = Value::Text("hi".into());
771 let result: Option<String> = from_value(val).unwrap();
772 assert_eq!(result, Some("hi".to_string()));
773 }
774
775 #[test]
776 fn deserialize_array_of_integers() {
777 let val = Value::Array(vec![Value::U32(1), Value::U32(2), Value::U32(3)]);
778 let result: Vec<u32> = from_value(val).unwrap();
779 assert_eq!(result, vec![1, 2, 3]);
780 }
781
782 #[test]
783 fn deserialize_unit_from_null() {
784 let val = Value::Null;
785 let result: () = from_value(val).unwrap();
786 assert_eq!(result, ());
787 }
788
789 #[test]
790 fn deserialize_unit_from_non_null_errors() {
791 let val = Value::U8(1);
792 let result: Result<(), Error> = from_value(val);
793 assert!(result.is_err());
794 }
795
796 #[test]
797 fn deserialize_char_from_single_char_text() {
798 let val = Value::Text("A".into());
799 let result: char = from_value(val).unwrap();
800 assert_eq!(result, 'A');
801 }
802
803 #[test]
804 fn deserialize_char_from_multi_char_text_errors() {
805 let val = Value::Text("AB".into());
806 let result: Result<char, Error> = from_value(val);
807 assert!(result.is_err());
808 }
809
810 #[test]
811 fn deserialize_struct_from_map() {
812 #[derive(Debug, PartialEq, Deserialize)]
813 struct Point {
814 x: i32,
815 y: i32,
816 }
817
818 let val = Value::Map(vec![
819 (Value::Text("x".into()), Value::I32(10)),
820 (Value::Text("y".into()), Value::I32(20)),
821 ]);
822 let result: Point = from_value(val).unwrap();
823 assert_eq!(result, Point { x: 10, y: 20 });
824 }
825
826 #[test]
827 fn deserialize_tuple_from_array() {
828 let val = Value::Array(vec![Value::U32(1), Value::U32(2)]);
829 let result: (u32, u32) = from_value(val).unwrap();
830 assert_eq!(result, (1, 2));
831 }
832
833 #[test]
834 fn deserialize_bool_type_mismatch_errors() {
835 let val = Value::U32(1);
836 let result: Result<bool, Error> = from_value(val);
837 assert!(result.is_err());
838 }
839
840 #[test]
841 fn deserialize_f64_type_mismatch_errors() {
842 let val = Value::Text("not_a_float".into());
843 let result: Result<f64, Error> = from_value(val);
844 assert!(result.is_err());
845 }
846
847 #[test]
848 fn deserialize_string_type_mismatch_errors() {
849 let val = Value::U32(42);
850 let result: Result<String, Error> = from_value(val);
851 assert!(result.is_err());
852 }
853
854 #[test]
855 fn deserialize_seq_type_mismatch_errors() {
856 let val = Value::U32(42);
857 let result: Result<Vec<u32>, Error> = from_value(val);
858 assert!(result.is_err());
859 }
860
861 #[test]
862 fn deserialize_map_type_mismatch_errors() {
863 let val = Value::U32(42);
864 let result: Result<std::collections::HashMap<String, u32>, Error> = from_value(val);
865 assert!(result.is_err());
866 }
867
868 #[test]
873 fn round_trip_struct() {
874 #[derive(Debug, PartialEq, Serialize, Deserialize)]
875 struct Data {
876 name: String,
877 count: u64,
878 active: bool,
879 }
880
881 let original = Data {
882 name: "test".into(),
883 count: 42,
884 active: true,
885 };
886 let val = to_value(&original).unwrap();
887 let recovered: Data = from_value(val).unwrap();
888 assert_eq!(original, recovered);
889 }
890
891 #[test]
892 fn round_trip_vec() {
893 let original = vec![1u32, 2, 3, 4, 5];
894 let val = to_value(&original).unwrap();
895 let recovered: Vec<u32> = from_value(val).unwrap();
896 assert_eq!(original, recovered);
897 }
898
899 #[test]
900 fn round_trip_option_some() {
901 let original: Option<String> = Some("hello".into());
902 let val = to_value(&original).unwrap();
903 let recovered: Option<String> = from_value(val).unwrap();
904 assert_eq!(original, recovered);
905 }
906
907 #[test]
908 fn round_trip_option_none() {
909 let original: Option<String> = None;
910 let val = to_value(&original).unwrap();
911 let recovered: Option<String> = from_value(val).unwrap();
912 assert_eq!(original, recovered);
913 }
914
915 #[test]
916 fn round_trip_nested_struct() {
917 #[derive(Debug, PartialEq, Serialize, Deserialize)]
918 struct Inner {
919 value: i32,
920 }
921 #[derive(Debug, PartialEq, Serialize, Deserialize)]
922 struct Outer {
923 inner: Inner,
924 label: String,
925 }
926
927 let original = Outer {
928 inner: Inner { value: -5 },
929 label: "test".into(),
930 };
931 let val = to_value(&original).unwrap();
932 let recovered: Outer = from_value(val).unwrap();
933 assert_eq!(original, recovered);
934 }
935
936 #[test]
937 fn round_trip_hashmap() {
938 let mut original = std::collections::HashMap::new();
939 original.insert("a".to_string(), 1u32);
940 original.insert("b".to_string(), 2u32);
941 let val = to_value(&original).unwrap();
942 let recovered: std::collections::HashMap<String, u32> = from_value(val).unwrap();
943 assert_eq!(original, recovered);
944 }
945
946 #[test]
951 fn value_deserialize_preserves_bool() {
952 let val = Value::Bool(false);
953 let cloned = val.clone();
954 let result: Value = from_value(cloned).unwrap();
955 assert_eq!(result, val);
956 }
957
958 #[test]
959 fn value_deserialize_preserves_text() {
960 let val = Value::Text("test".into());
961 let cloned = val.clone();
962 let result: Value = from_value(cloned).unwrap();
963 assert_eq!(result, val);
964 }
965
966 #[test]
967 fn value_deserialize_preserves_integer_types() {
968 for val in [
969 Value::U8(1),
970 Value::I8(-1),
971 Value::U16(100),
972 Value::I16(-100),
973 Value::U32(1000),
974 Value::I32(-1000),
975 Value::U64(10000),
976 Value::I64(-10000),
977 Value::U128(100000),
978 Value::I128(-100000),
979 ] {
980 let cloned = val.clone();
981 let result: Value = from_value(cloned).unwrap();
982 assert_eq!(result, val);
983 }
984 }
985
986 #[test]
987 fn value_deserialize_preserves_float() {
988 let val = Value::Float(2.718);
989 let cloned = val.clone();
990 let result: Value = from_value(cloned).unwrap();
991 assert_eq!(result, val);
992 }
993
994 #[test]
995 fn value_deserialize_preserves_null() {
996 let val = Value::Null;
997 let cloned = val.clone();
998 let result: Value = from_value(cloned).unwrap();
999 assert_eq!(result, val);
1000 }
1001
1002 #[test]
1003 fn value_deserialize_preserves_array() {
1004 let val = Value::Array(vec![Value::U8(1), Value::Text("hello".into())]);
1005 let cloned = val.clone();
1006 let result: Value = from_value(cloned).unwrap();
1007 assert_eq!(result, val);
1008 }
1009
1010 #[test]
1011 fn value_deserialize_preserves_map() {
1012 let val = Value::Map(vec![(Value::Text("key".into()), Value::U64(42))]);
1013 let cloned = val.clone();
1014 let result: Value = from_value(cloned).unwrap();
1015 assert_eq!(result, val);
1016 }
1017
1018 #[test]
1023 fn value_deserialize_bytes_as_value() {
1024 let val = Value::Bytes(vec![1, 2, 3]);
1025 let cloned = val.clone();
1026 let result: Value = from_value(cloned).unwrap();
1027 assert_eq!(result, val);
1028 }
1029
1030 #[test]
1031 fn value_deserialize_bytes32_as_value() {
1032 let val = Value::Bytes32([7u8; 32]);
1033 let cloned = val.clone();
1034 let result: Value = from_value(cloned).unwrap();
1035 assert_eq!(result, Value::Bytes(vec![7u8; 32]));
1037 }
1038
1039 #[test]
1040 fn value_deserialize_bytes20_as_value() {
1041 let val = Value::Bytes20([8u8; 20]);
1042 let cloned = val.clone();
1043 let result: Value = from_value(cloned).unwrap();
1044 assert_eq!(result, Value::Bytes(vec![8u8; 20]));
1046 }
1047
1048 #[test]
1049 fn value_deserialize_bytes36_as_value() {
1050 let val = Value::Bytes36([9u8; 36]);
1051 let cloned = val.clone();
1052 let result: Value = from_value(cloned).unwrap();
1053 assert_eq!(result, Value::Bytes(vec![9u8; 36]));
1055 }
1056
1057 #[test]
1058 fn value_deserialize_identifier_as_value() {
1059 let val = Value::Identifier([10u8; 32]);
1060 let cloned = val.clone();
1061 let result: Value = from_value(cloned).unwrap();
1062 assert_eq!(result, Value::Bytes(vec![10u8; 32]));
1064 }
1065
1066 #[test]
1071 fn deserialize_newtype_struct() {
1072 #[derive(Debug, PartialEq, Serialize, Deserialize)]
1073 struct Wrapper(u32);
1074
1075 let val = Value::U32(42);
1076 let result: Wrapper = from_value(val).unwrap();
1077 assert_eq!(result, Wrapper(42));
1078 }
1079
1080 #[test]
1085 fn deserialize_unit_struct_from_null() {
1086 #[derive(Debug, PartialEq, Deserialize)]
1087 struct Empty;
1088
1089 let val = Value::Null;
1090 let result: Empty = from_value(val).unwrap();
1091 assert_eq!(result, Empty);
1092 }
1093
1094 #[test]
1099 fn deserialize_bytes_from_bytes_value() {
1100 let val = Value::Bytes(vec![1, 2, 3, 4]);
1101 let result: Value = from_value(val.clone()).unwrap();
1102 assert_eq!(result, val);
1103 }
1104
1105 #[test]
1106 fn deserialize_bytes_type_mismatch_errors() {
1107 use serde::de::Deserializer as _;
1108 struct BytesVisitor;
1109 impl<'de> de::Visitor<'de> for BytesVisitor {
1110 type Value = Vec<u8>;
1111 fn expecting(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
1112 write!(f, "bytes")
1113 }
1114 fn visit_bytes<E: de::Error>(self, v: &[u8]) -> Result<Self::Value, E> {
1115 Ok(v.to_vec())
1116 }
1117 }
1118 let deser = Deserializer(Value::Bool(true));
1119 let result = deser.deserialize_bytes(BytesVisitor);
1120 assert!(result.is_err());
1121 }
1122
1123 #[test]
1128 fn deserialize_unit_enum_from_text() {
1129 #[derive(Debug, PartialEq, Deserialize)]
1130 enum Color {
1131 Red,
1132 Green,
1133 Blue,
1134 }
1135 let val = Value::Text("Red".into());
1136 let result: Color = from_value(val).unwrap();
1137 assert_eq!(result, Color::Red);
1138 }
1139
1140 #[test]
1141 fn deserialize_newtype_enum_from_map() {
1142 #[derive(Debug, PartialEq, Serialize, Deserialize)]
1143 enum Wrapper {
1144 Count(u32),
1145 }
1146 let val = Value::Map(vec![(Value::Text("Count".into()), Value::U32(42))]);
1147 let result: Wrapper = from_value(val).unwrap();
1148 assert_eq!(result, Wrapper::Count(42));
1149 }
1150
1151 #[test]
1152 fn round_trip_unit_enum() {
1153 #[derive(Debug, PartialEq, Serialize, Deserialize)]
1154 enum Direction {
1155 Up,
1156 Down,
1157 }
1158 let original = Direction::Up;
1159 let val = to_value(&original).unwrap();
1160 let recovered: Direction = from_value(val).unwrap();
1161 assert_eq!(original, recovered);
1162 }
1163
1164 #[test]
1165 fn round_trip_newtype_enum() {
1166 #[derive(Debug, PartialEq, Serialize, Deserialize)]
1167 enum Payload {
1168 Message(String),
1169 }
1170 let original = Payload::Message("hello".into());
1171 let val = to_value(&original).unwrap();
1172 let recovered: Payload = from_value(val).unwrap();
1173 assert_eq!(original, recovered);
1174 }
1175
1176 #[test]
1177 fn round_trip_struct_enum() {
1178 #[derive(Debug, PartialEq, Serialize, Deserialize)]
1179 enum Shape {
1180 Circle { radius: u32 },
1181 }
1182 let original = Shape::Circle { radius: 5 };
1183 let val = to_value(&original).unwrap();
1184 let recovered: Shape = from_value(val).unwrap();
1185 assert_eq!(original, recovered);
1186 }
1187
1188 #[test]
1189 fn round_trip_tuple_enum() {
1190 #[derive(Debug, PartialEq, Serialize, Deserialize)]
1191 enum Pair {
1192 Coords(i32, i32),
1193 }
1194 let original = Pair::Coords(10, 20);
1195 let val = to_value(&original).unwrap();
1196 let recovered: Pair = from_value(val).unwrap();
1197 assert_eq!(original, recovered);
1198 }
1199}