scale_value/serde_impls/
deserialize.rs

1// Copyright (C) 2022-2023 Parity Technologies (UK) Ltd. (admin@parity.io)
2// This file is a part of the scale-value crate.
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8//         http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15
16//! This module implements the [`Deserialize`] (no R!) trait on our [`Value`] enum.
17//!
18//! The [`Deserialize`] trait is responsible for telling some deserializer (note the 'r')
19//! what sorts of values we need back in order to construst an instance of our [`Value`] type.
20//! Since the [`Value`] type accepts a range of possible values, it leans heavily on the
21//! `deserialize_any` method; this means that the deserializer needs to know what structure it's
22//! working with in order to be able to provide back the right values; we can't tell it what structure
23//! we expect.
24//!
25//! One thing we aim for is to be able to losslessly deserialize a [`Value`] into a
26//! [`Value`]. This would allow for partial type deserialization, for instance we might want to turn
27//! only part of our input into a struct, say, and leave the rest as [`Value`] types until we know what
28//! to do with them.
29
30use 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            // We have to ask for a particular enum type, but we don't know what type
229            // of enum to expect (we support anything!). So, we just call the visitor method
230            // that doesn't require any extra fields, and we know that this will just give back
231            // whatever it can based on our impl (who knows about other impls though).
232            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        // Wrap "Some"-like things in a Some variant.
242        // This aligns with how we serialize these back to optionals.
243        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        // If the thing is "none", wrap it in a None variant.
252        // This aligns with how we serialize these back to optionals.
253        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        // We support deserializing from a map that looks like
261        // { name: "VariantName", values: [1,2,3] } into Variant + Composite::Unnamed, or
262        // { name: "VariantName", values: { "a": 1, "b": 2 }} into Variant + Composite::Named
263        // to line up with our Serialize impl for the Value types.
264        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
291// It gets repetitive writing out the visitor impls to delegate to the Value subtypes;
292// this helper makes that a little easier:
293macro_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        // Return a bitvec or a composite type depending on the map values.
371        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    /// Does a value deserialize to itself?
392    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    /// Does a value `a` deserialize to the expected value `b`?
402    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        // Alas, I256 and U256 are both a sequence of bytes, which could equally be represented
420        // by a composite sequence (as other sequences-of-things are). We could have a special case where
421        // precisely 32 u8's is deserialized to one of U256 or I256, but for now we use our more general
422        // composite type as the sequence catch-all:
423        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        // .. that said; if you want a primitive value back, you can use that type directly to get it
433        // (as long as we are given exactly 32 bytes):
434
435        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        // Unwrapped versions also work:
445
446        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        // We can also go from wrapped to unwrapped:
455
456        assert_value_to_value(Value::u128(123), Primitive::u128(123));
457        assert_value_to_value(Value::i128(123), Primitive::i128(123));
458
459        // Or vice versa:
460
461        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        // unwrapped:
473
474        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        // unwrapped work as well:
499
500        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            // These could come back in any order so we need to search for them:
576            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                // All JSON numbers deserialize to U64 or I64 or F64 as necessary:
628                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                // All JSON numbers deserialize to U64 or I64 or F64 as necessary:
648                ("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", // "names", not "name".
660                "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 // unexpected third prop.
669            })),
670            Err(..)
671        ));
672        assert!(matches!(
673            Variant::deserialize(serde_json::json!({
674                "names": "Hello",
675                "values": 1 // incorrect type of values
676            })),
677            Err(..)
678        ));
679    }
680}