bevy_reflect/serde/de/
tuple_structs.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
use crate::{
    serde::{de::tuple_utils::visit_tuple, SerializationData},
    DynamicTupleStruct, TupleStructInfo, TypeRegistration, TypeRegistry,
};
use core::{fmt, fmt::Formatter};
use serde::de::{DeserializeSeed, SeqAccess, Visitor};

use super::{registration_utils::try_get_registration, TypedReflectDeserializer};

use super::ReflectDeserializerProcessor;

/// A [`Visitor`] for deserializing [`TupleStruct`] values.
///
/// [`TupleStruct`]: crate::TupleStruct
pub(super) struct TupleStructVisitor<'a, P> {
    pub tuple_struct_info: &'static TupleStructInfo,
    pub registration: &'a TypeRegistration,
    pub registry: &'a TypeRegistry,
    pub processor: Option<&'a mut P>,
}

impl<'de, P: ReflectDeserializerProcessor> Visitor<'de> for TupleStructVisitor<'_, P> {
    type Value = DynamicTupleStruct;

    fn expecting(&self, formatter: &mut Formatter) -> fmt::Result {
        formatter.write_str("reflected tuple struct value")
    }

    fn visit_seq<V>(self, mut seq: V) -> Result<Self::Value, V::Error>
    where
        V: SeqAccess<'de>,
    {
        visit_tuple(
            &mut seq,
            self.tuple_struct_info,
            self.registration,
            self.registry,
            self.processor,
        )
        .map(DynamicTupleStruct::from)
    }

    fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
    where
        D: serde::Deserializer<'de>,
    {
        let mut tuple = DynamicTupleStruct::default();
        let serialization_data = self.registration.data::<SerializationData>();

        if let Some(value) = serialization_data.and_then(|data| data.generate_default(0)) {
            tuple.insert_boxed(value.into_partial_reflect());
            return Ok(tuple);
        }

        let registration = try_get_registration(
            *self
                .tuple_struct_info
                .field_at(0)
                .ok_or(serde::de::Error::custom("Field at index 0 not found"))?
                .ty(),
            self.registry,
        )?;
        let reflect_deserializer =
            TypedReflectDeserializer::new_internal(registration, self.registry, self.processor);
        let value = reflect_deserializer.deserialize(deserializer)?;

        tuple.insert_boxed(value.into_partial_reflect());

        Ok(tuple)
    }
}