Skip to main content

bevy_reflect/serde/de/
structs.rs

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