bevy_reflect/serde/de/
structs.rs

1use crate::{
2    serde::de::struct_utils::{visit_struct, visit_struct_seq},
3    DynamicStruct, StructInfo, TypeRegistration, TypeRegistry,
4};
5use core::{fmt, fmt::Formatter};
6use serde::de::{MapAccess, SeqAccess, Visitor};
7
8use super::ReflectDeserializerProcessor;
9
10/// A [`Visitor`] for deserializing [`Struct`] values.
11///
12/// [`Struct`]: crate::Struct
13pub(super) struct StructVisitor<'a, P> {
14    pub struct_info: &'static StructInfo,
15    pub registration: &'a TypeRegistration,
16    pub registry: &'a TypeRegistry,
17    pub processor: Option<&'a mut P>,
18}
19
20impl<'de, P: ReflectDeserializerProcessor> Visitor<'de> for StructVisitor<'_, P> {
21    type Value = DynamicStruct;
22
23    fn expecting(&self, formatter: &mut Formatter) -> fmt::Result {
24        formatter.write_str("reflected struct value")
25    }
26
27    fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
28    where
29        A: SeqAccess<'de>,
30    {
31        visit_struct_seq(
32            &mut seq,
33            self.struct_info,
34            self.registration,
35            self.registry,
36            self.processor,
37        )
38    }
39
40    fn visit_map<V>(self, mut map: V) -> Result<Self::Value, V::Error>
41    where
42        V: MapAccess<'de>,
43    {
44        visit_struct(
45            &mut map,
46            self.struct_info,
47            self.registration,
48            self.registry,
49            self.processor,
50        )
51    }
52}