Path: blob/main/crates/bevy_reflect/src/serde/de/tuple_structs.rs
6600 views
use crate::{1serde::{de::tuple_utils::visit_tuple, SerializationData},2DynamicTupleStruct, TupleStructInfo, TypeRegistration, TypeRegistry,3};4use core::{fmt, fmt::Formatter};5use serde::de::{DeserializeSeed, SeqAccess, Visitor};67use super::{registration_utils::try_get_registration, TypedReflectDeserializer};89use super::ReflectDeserializerProcessor;1011/// A [`Visitor`] for deserializing [`TupleStruct`] values.12///13/// [`TupleStruct`]: crate::TupleStruct14pub(super) struct TupleStructVisitor<'a, P> {15pub tuple_struct_info: &'static TupleStructInfo,16pub registration: &'a TypeRegistration,17pub registry: &'a TypeRegistry,18pub processor: Option<&'a mut P>,19}2021impl<'de, P: ReflectDeserializerProcessor> Visitor<'de> for TupleStructVisitor<'_, P> {22type Value = DynamicTupleStruct;2324fn expecting(&self, formatter: &mut Formatter) -> fmt::Result {25formatter.write_str("reflected tuple struct value")26}2728fn visit_seq<V>(self, mut seq: V) -> Result<Self::Value, V::Error>29where30V: SeqAccess<'de>,31{32visit_tuple(33&mut seq,34self.tuple_struct_info,35self.registration,36self.registry,37self.processor,38)39.map(DynamicTupleStruct::from)40}4142fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>43where44D: serde::Deserializer<'de>,45{46let mut tuple = DynamicTupleStruct::default();47let serialization_data = self.registration.data::<SerializationData>();4849if let Some(value) = serialization_data.and_then(|data| data.generate_default(0)) {50tuple.insert_boxed(value.into_partial_reflect());51return Ok(tuple);52}5354let registration = try_get_registration(55*self56.tuple_struct_info57.field_at(0)58.ok_or(serde::de::Error::custom("Field at index 0 not found"))?59.ty(),60self.registry,61)?;62let reflect_deserializer =63TypedReflectDeserializer::new_internal(registration, self.registry, self.processor);64let value = reflect_deserializer.deserialize(deserializer)?;6566tuple.insert_boxed(value.into_partial_reflect());6768Ok(tuple)69}70}717273