1use super::bitvec_helpers;
31use crate::prelude::*;
32use crate::{Composite, Primitive, Value, ValueDef, Variant};
33use core::convert::TryInto;
34use serde::{
35 self,
36 de::{Error, Visitor},
37 Deserialize, Deserializer,
38};
39
40impl<'de> Deserialize<'de> for Value<()> {
41 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
42 where
43 D: serde::Deserializer<'de>,
44 {
45 let value = deserializer.deserialize_any(ValueDefVisitor)?;
46 Ok(Value { value, context: () })
47 }
48}
49
50impl<'de> Deserialize<'de> for ValueDef<()> {
51 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
52 where
53 D: serde::Deserializer<'de>,
54 {
55 deserializer.deserialize_any(ValueDefVisitor)
56 }
57}
58
59impl<'de> Deserialize<'de> for Primitive {
60 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
61 where
62 D: serde::Deserializer<'de>,
63 {
64 deserializer.deserialize_any(PrimitiveVisitor)
65 }
66}
67
68impl<'de> Deserialize<'de> for Composite<()> {
69 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
70 where
71 D: serde::Deserializer<'de>,
72 {
73 deserializer.deserialize_any(CompositeVisitor)
74 }
75}
76
77impl<'de> Deserialize<'de> for Variant<()> {
78 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
79 where
80 D: serde::Deserializer<'de>,
81 {
82 deserializer.deserialize_any(VariantVisitor)
83 }
84}
85
86struct PrimitiveVisitor;
87
88macro_rules! visit_prim {
89 ($name:ident $ty:ident $variant:ident) => {
90 fn $name<E>(self, v: $ty) -> Result<Self::Value, E>
91 where
92 E: serde::de::Error,
93 {
94 Ok(Primitive::$variant(v.into()))
95 }
96 };
97}
98
99impl<'de> Visitor<'de> for PrimitiveVisitor {
100 type Value = Primitive;
101
102 fn expecting(&self, formatter: &mut core::fmt::Formatter) -> core::fmt::Result {
103 formatter.write_str("a type that can be decoded into a Primitive value")
104 }
105
106 visit_prim!(visit_bool bool Bool);
107 visit_prim!(visit_i8 i8 I128);
108 visit_prim!(visit_i16 i16 I128);
109 visit_prim!(visit_i32 i32 I128);
110 visit_prim!(visit_i64 i64 I128);
111 visit_prim!(visit_i128 i128 I128);
112 visit_prim!(visit_u8 u8 U128);
113 visit_prim!(visit_u16 u16 U128);
114 visit_prim!(visit_u32 u32 U128);
115 visit_prim!(visit_u64 u64 U128);
116 visit_prim!(visit_u128 u128 U128);
117 visit_prim!(visit_char char Char);
118
119 fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
120 where
121 E: serde::de::Error,
122 {
123 Ok(Primitive::String(v.into()))
124 }
125
126 fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
127 where
128 E: serde::de::Error,
129 {
130 Ok(Primitive::String(v))
131 }
132
133 fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
134 where
135 E: serde::de::Error,
136 {
137 let val = v
138 .try_into()
139 .map_err(|_| serde::de::Error::invalid_type(serde::de::Unexpected::Bytes(v), &self))?;
140 Ok(Primitive::U256(val))
141 }
142
143 fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
144 where
145 A: serde::de::SeqAccess<'de>,
146 {
147 let mut vals = Vec::new();
148 while let Some(el) = seq.next_element()? {
149 vals.push(el)
150 }
151 let len = vals.len();
152 let arr = vals
153 .try_into()
154 .map_err(|_| serde::de::Error::invalid_length(len, &"exactly 32 bytes"))?;
155 Ok(Primitive::U256(arr))
156 }
157}
158
159struct CompositeVisitor;
160
161impl<'de> Visitor<'de> for CompositeVisitor {
162 type Value = Composite<()>;
163
164 fn expecting(&self, formatter: &mut core::fmt::Formatter) -> core::fmt::Result {
165 formatter.write_str("a type that can be decoded into a Composite value")
166 }
167
168 fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
169 where
170 E: serde::de::Error,
171 {
172 let byte_values = v.iter().map(|&b| Value::u128(b as u128)).collect();
173 Ok(Composite::Unnamed(byte_values))
174 }
175
176 fn visit_unit<E>(self) -> Result<Self::Value, E>
177 where
178 E: serde::de::Error,
179 {
180 Ok(Composite::Unnamed(Vec::new()))
181 }
182
183 fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
184 where
185 D: Deserializer<'de>,
186 {
187 Composite::deserialize(deserializer)
188 }
189
190 fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
191 where
192 A: serde::de::SeqAccess<'de>,
193 {
194 let mut values = Vec::with_capacity(seq.size_hint().unwrap_or(0));
195 while let Some(value) = seq.next_element()? {
196 values.push(value);
197 }
198 Ok(Composite::Unnamed(values))
199 }
200
201 fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
202 where
203 A: serde::de::MapAccess<'de>,
204 {
205 let mut values = Vec::with_capacity(map.size_hint().unwrap_or(0));
206 while let Some(key_val) = map.next_entry()? {
207 values.push(key_val);
208 }
209 Ok(Composite::Named(values))
210 }
211}
212
213struct VariantVisitor;
214
215impl<'de> Visitor<'de> for VariantVisitor {
216 type Value = Variant<()>;
217
218 fn expecting(&self, formatter: &mut core::fmt::Formatter) -> core::fmt::Result {
219 formatter.write_str("a type that can be decoded into an enum Variant")
220 }
221
222 fn visit_enum<A>(self, data: A) -> Result<Self::Value, A::Error>
223 where
224 A: serde::de::EnumAccess<'de>,
225 {
226 data.variant().and_then(|(name, variant_access)| {
227 use serde::de::VariantAccess;
228 let values = variant_access.newtype_variant()?;
233 Ok(Variant { name, values })
234 })
235 }
236
237 fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
238 where
239 D: serde::Deserializer<'de>,
240 {
241 let inner = Value::deserialize(deserializer)?;
244 Ok(Variant { name: "Some".to_string(), values: Composite::Unnamed(vec![inner]) })
245 }
246
247 fn visit_none<E>(self) -> Result<Self::Value, E>
248 where
249 E: Error,
250 {
251 Ok(Variant { name: "None".to_string(), values: Composite::Unnamed(Vec::new()) })
254 }
255
256 fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
257 where
258 A: serde::de::MapAccess<'de>,
259 {
260 let mut name = None;
265 let mut values = None;
266
267 while let Some(k) = map.next_key::<String>()? {
268 match &*k {
269 "name" => {
270 name = Some(map.next_value()?);
271 }
272 "values" => {
273 values = Some(map.next_value()?);
274 }
275 other => return Err(A::Error::unknown_field(other, &["name", "values"])),
276 }
277 }
278
279 if let (Some(name), Some(values)) = (name, values) {
280 Ok(Variant { name, values })
281 } else {
282 Err(A::Error::custom(
283 "map must contain 'name' and 'values' to deserialize to a Variant",
284 ))
285 }
286 }
287}
288
289struct ValueDefVisitor;
290
291macro_rules! delegate_visitor_fn {
294 (
295 $visitor:ident $mapping:path,
296 $( $name:ident($($ty:ty)?) )+
297 ) => {
298 $(
299 fn $name<E>(self, $(v: $ty)?) -> Result<Self::Value, E>
300 where E: serde::de::Error {
301 $visitor.$name($(v as $ty)?).map($mapping)
302 }
303 )+
304 }
305}
306
307impl<'de> Visitor<'de> for ValueDefVisitor {
308 type Value = ValueDef<()>;
309
310 fn expecting(&self, formatter: &mut core::fmt::Formatter) -> core::fmt::Result {
311 formatter.write_str("a type that can be decoded into a Value")
312 }
313
314 delegate_visitor_fn!(
315 PrimitiveVisitor ValueDef::Primitive,
316 visit_bool(bool)
317 visit_i8(i8)
318 visit_i16(i16)
319 visit_i32(i32)
320 visit_i64(i64)
321 visit_i128(i128)
322 visit_u8(u8)
323 visit_u16(u16)
324 visit_u32(u32)
325 visit_u64(u64)
326 visit_u128(u128)
327 visit_char(char)
328 visit_str(&str)
329 visit_string(String)
330 );
331
332 delegate_visitor_fn!(
333 CompositeVisitor ValueDef::Composite,
334 visit_unit()
335 visit_bytes(&[u8])
336 );
337
338 fn visit_none<E>(self) -> Result<Self::Value, E>
339 where
340 E: Error,
341 {
342 VariantVisitor.visit_none().map(ValueDef::Variant)
343 }
344
345 fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
346 where
347 D: serde::Deserializer<'de>,
348 {
349 VariantVisitor.visit_some(deserializer).map(ValueDef::Variant)
350 }
351
352 fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
353 where
354 D: serde::Deserializer<'de>,
355 {
356 ValueDef::deserialize(deserializer)
357 }
358
359 fn visit_seq<A>(self, seq: A) -> Result<Self::Value, A::Error>
360 where
361 A: serde::de::SeqAccess<'de>,
362 {
363 CompositeVisitor.visit_seq(seq).map(ValueDef::Composite)
364 }
365
366 fn visit_map<A>(self, map: A) -> Result<Self::Value, A::Error>
367 where
368 A: serde::de::MapAccess<'de>,
369 {
370 bitvec_helpers::MapOrBitSeqVisitor.visit_map(map)
372 }
373
374 fn visit_enum<A>(self, data: A) -> Result<Self::Value, A::Error>
375 where
376 A: serde::de::EnumAccess<'de>,
377 {
378 VariantVisitor.visit_enum(data).map(ValueDef::Variant)
379 }
380}
381
382#[cfg(test)]
383mod test {
384 use super::*;
385 use serde_json::json;
386
387 use crate::value;
388
389 use super::super::DeserializerError;
390
391 fn assert_value_isomorphic<
393 'de,
394 V: Deserializer<'de> + Deserialize<'de> + PartialEq + core::fmt::Debug + Clone,
395 >(
396 val: V,
397 ) {
398 assert_value_to_value(val.clone(), val)
399 }
400
401 fn assert_value_to_value<'de, V1, V2>(a: V1, b: V2)
403 where
404 V1: Deserializer<'de>,
405 V2: Deserialize<'de> + PartialEq + core::fmt::Debug + Clone,
406 {
407 let new_val = V2::deserialize(a).expect("Can deserialize");
408 assert_eq!(b, new_val);
409 }
410
411 #[test]
412 fn deserialize_primitives_isomorphic() {
413 assert_value_isomorphic(Value::u128(123));
414 assert_value_isomorphic(Value::i128(123));
415 assert_value_isomorphic(Value::bool(true));
416 assert_value_isomorphic(Value::char('a'));
417 assert_value_isomorphic(Value::string("Hello!"));
418
419 assert_value_to_value(
424 ValueDef::<()>::Primitive(Primitive::I256([1; 32])),
425 Value::unnamed_composite(vec![1u8; 32].into_iter().map(|b| Value::u128(b.into()))),
426 );
427 assert_value_to_value(
428 ValueDef::<()>::Primitive(Primitive::U256([1; 32])),
429 Value::unnamed_composite(vec![1u8; 32].into_iter().map(|b| Value::u128(b.into()))),
430 );
431
432 assert_value_to_value(
436 ValueDef::<()>::Primitive(Primitive::I256([1; 32])),
437 Primitive::U256([1; 32]),
438 );
439 assert_value_to_value(
440 ValueDef::<()>::Primitive(Primitive::U256([1; 32])),
441 Primitive::U256([1; 32]),
442 );
443
444 assert_value_isomorphic(Primitive::U128(123));
447 assert_value_isomorphic(Primitive::U256([1; 32]));
448 assert_value_isomorphic(Primitive::I128(123));
449 assert_value_isomorphic(Primitive::Bool(true));
450 assert_value_isomorphic(Primitive::Char('a'));
451 assert_value_isomorphic(Primitive::String("Hello!".into()));
452 assert_value_to_value(Primitive::I256([1; 32]), Primitive::U256([1; 32]));
453
454 assert_value_to_value(Value::u128(123), Primitive::u128(123));
457 assert_value_to_value(Value::i128(123), Primitive::i128(123));
458
459 assert_value_to_value(Primitive::u128(123), Value::u128(123));
462 assert_value_to_value(Primitive::i128(123), Value::i128(123));
463 }
464
465 #[test]
466 fn deserialize_composites_isomorphic() {
467 assert_value_isomorphic(value!((123u8, true)));
468 assert_value_isomorphic(value!({}));
469 assert_value_isomorphic(value!({a: 123u8, b: true}));
470 assert_value_isomorphic(value!({a: 123u8, b: { c: 123u8, d: "hello"}}));
471
472 assert_value_isomorphic(Composite::unnamed(vec![Value::u128(123), Value::bool(true)]));
475 assert_value_isomorphic(Composite::unnamed(vec![]));
476 assert_value_isomorphic(Composite::named(vec![
477 ("a", Value::u128(123)),
478 ("b", Value::bool(true)),
479 ]));
480 assert_value_isomorphic(Composite::named(vec![
481 ("a", Value::u128(123)),
482 ("b", value!({ c: 123u8, d: "hello"})),
483 ]));
484 }
485
486 #[test]
487 fn deserialize_variants_isomorphic() {
488 assert_value_isomorphic(ValueDef::Variant(Variant::unnamed_fields(
489 "Foo",
490 [Value::u128(123), Value::bool(true)],
491 )));
492 assert_value_isomorphic(ValueDef::Variant(Variant::unnamed_fields("Foo", [])));
493 assert_value_isomorphic(ValueDef::Variant(Variant::named_fields(
494 "Foo",
495 [("a", Value::u128(123)), ("b", Value::bool(true))],
496 )));
497
498 assert_value_isomorphic(Variant::unnamed_fields(
501 "Foo",
502 [Value::u128(123), Value::bool(true)],
503 ));
504 assert_value_isomorphic(Variant::unnamed_fields("Foo", vec![]));
505 assert_value_isomorphic(Variant::named_fields(
506 "Foo",
507 [("a", Value::u128(123)), ("b", Value::bool(true))],
508 ));
509 }
510
511 #[test]
512 fn deserialize_bitsequences_isomorphic() {
513 use scale_bits::bits;
514 assert_value_isomorphic(ValueDef::BitSequence(bits![]));
515 assert_value_isomorphic(ValueDef::BitSequence(bits![0]));
516 assert_value_isomorphic(ValueDef::BitSequence(bits![0, 1, 1, 0, 1, 0, 1, 1, 1]));
517 }
518
519 #[test]
520 fn deserialize_bitsequence_from_json() {
521 use scale_bits::bits;
522
523 let bits_json = json!({
524 "__bitvec__values__": [true, false, true, true, false]
525 });
526
527 let val: Value = serde_json::from_value(bits_json).unwrap();
528 assert_eq!(val.value, ValueDef::BitSequence(bits![true, false, true, true, false]));
529 }
530
531 #[test]
532 fn sequence_to_value() {
533 use serde::de::{value::SeqDeserializer, IntoDeserializer};
534
535 let de: SeqDeserializer<_, DeserializerError> = vec![1u8, 2, 3, 4].into_deserializer();
536
537 assert_value_to_value(de.clone(), value!((1u8, 2u8, 3u8, 4u8)));
538 assert_value_to_value(
539 de,
540 Composite::Unnamed(vec![
541 Value::u128(1),
542 Value::u128(2),
543 Value::u128(3),
544 Value::u128(4),
545 ]),
546 );
547 }
548
549 #[test]
550 fn sequence_to_primitive() {
551 use serde::de::{value::SeqDeserializer, IntoDeserializer};
552
553 let de: SeqDeserializer<_, DeserializerError> = vec![1u8; 32].into_deserializer();
554
555 assert_value_to_value(de, Primitive::U256([1; 32]));
556 }
557
558 #[test]
559 fn map_to_value() {
560 use alloc::collections::BTreeMap;
561 use serde::de::{value::MapDeserializer, IntoDeserializer};
562
563 let map = {
564 let mut map = BTreeMap::<&'static str, i32>::new();
565 map.insert("a", 1i32);
566 map.insert("b", 2i32);
567 map.insert("c", 3i32);
568 map
569 };
570
571 let de: MapDeserializer<_, DeserializerError> = map.into_deserializer();
572
573 let value = ValueDef::deserialize(de).expect("should deserialize OK");
574 if let ValueDef::Composite(Composite::Named(vals)) = value {
575 assert!(vals.contains(&("a".into(), Value::i128(1))));
577 assert!(vals.contains(&("b".into(), Value::i128(2))));
578 assert!(vals.contains(&("c".into(), Value::i128(3))));
579 } else {
580 panic!("Map should deserialize into Composite::Named value but we have {value:?}");
581 }
582 }
583
584 #[test]
585 fn partially_deserialize_value() {
586 let value = Value::named_composite(vec![
587 ("a", Value::u128(123)),
588 ("b", value!({c: 123u8, d: "hello", e: {}})),
589 ]);
590
591 #[derive(Deserialize, Debug, PartialEq)]
592 struct Partial {
593 a: Value<()>,
594 b: PartialB,
595 }
596
597 #[derive(Deserialize, Debug, PartialEq)]
598 struct PartialB {
599 c: u128,
600 d: String,
601 e: Value<()>,
602 }
603
604 let partial = Partial::deserialize(value).expect("should work");
605
606 assert_eq!(
607 partial,
608 Partial {
609 a: Value::u128(123),
610 b: PartialB { c: 123, d: "hello".into(), e: value!({}) }
611 }
612 )
613 }
614
615 #[test]
616 fn deserialize_well_formed_map_to_unnamed_variant() {
617 let v: Variant<()> = Variant::deserialize(serde_json::json!({
618 "name": "Hello",
619 "values": [1, 2, true]
620 }))
621 .unwrap();
622
623 assert_eq!(v.name, "Hello".to_string());
624 assert_eq!(
625 v.values,
626 Composite::Unnamed(vec![
627 Value::u128(1),
629 Value::u128(2),
630 Value::bool(true),
631 ])
632 )
633 }
634
635 #[test]
636 fn deserialize_well_formed_map_to_named_variant() {
637 let v: Variant<()> = Variant::deserialize(serde_json::json!({
638 "name": "Hello",
639 "values": { "a": 1, "b": 2, "c": true }
640 }))
641 .unwrap();
642
643 assert_eq!(v.name, "Hello".to_string());
644 assert_eq!(
645 v.values,
646 Composite::Named(vec![
647 ("a".into(), Value::u128(1)),
649 ("b".into(), Value::u128(2)),
650 ("c".into(), Value::bool(true)),
651 ])
652 )
653 }
654
655 #[test]
656 fn cannot_deserialize_malformed_map_to_variant() {
657 assert!(matches!(
658 Variant::deserialize(serde_json::json!({
659 "names": "Hello", "values": [1, 2, true]
661 })),
662 Err(..)
663 ));
664 assert!(matches!(
665 Variant::deserialize(serde_json::json!({
666 "name": "Hello",
667 "values": [1, 2, true],
668 "other": true })),
670 Err(..)
671 ));
672 assert!(matches!(
673 Variant::deserialize(serde_json::json!({
674 "names": "Hello",
675 "values": 1 })),
677 Err(..)
678 ));
679 }
680}