Path: blob/main/crates/bevy_reflect/src/serde/de/tuple_structs.rs
9371 views
use crate::{1serde::{de::tuple_utils::visit_tuple, SerializationData},2tuple_struct::{DynamicTupleStruct, TupleStructInfo},3TypeRegistration, TypeRegistry,4};5use core::{fmt, fmt::Formatter};6use serde::de::{DeserializeSeed, SeqAccess, Visitor};78use super::{registration_utils::try_get_registration, TypedReflectDeserializer};910use super::ReflectDeserializerProcessor;1112/// A [`Visitor`] for deserializing [`TupleStruct`] values.13///14/// [`TupleStruct`]: crate::tuple_struct::TupleStruct15pub(super) struct TupleStructVisitor<'a, P> {16pub tuple_struct_info: &'static TupleStructInfo,17pub registration: &'a TypeRegistration,18pub registry: &'a TypeRegistry,19pub processor: Option<&'a mut P>,20}2122impl<'de, P: ReflectDeserializerProcessor> Visitor<'de> for TupleStructVisitor<'_, P> {23type Value = DynamicTupleStruct;2425fn expecting(&self, formatter: &mut Formatter) -> fmt::Result {26formatter.write_str("reflected tuple struct value")27}2829fn visit_seq<V>(self, mut seq: V) -> Result<Self::Value, V::Error>30where31V: SeqAccess<'de>,32{33visit_tuple(34&mut seq,35self.tuple_struct_info,36self.registration,37self.registry,38self.processor,39)40.map(DynamicTupleStruct::from)41}4243fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>44where45D: serde::Deserializer<'de>,46{47let mut tuple = DynamicTupleStruct::default();48let serialization_data = self.registration.data::<SerializationData>();4950if let Some(value) = serialization_data.and_then(|data| data.generate_default(0)) {51tuple.insert_boxed(value.into_partial_reflect());52return Ok(tuple);53}5455let registration = try_get_registration(56*self57.tuple_struct_info58.field_at(0)59.ok_or(serde::de::Error::custom("Field at index 0 not found"))?60.ty(),61self.registry,62)?;63let reflect_deserializer =64TypedReflectDeserializer::new_internal(registration, self.registry, self.processor);65let value = reflect_deserializer.deserialize(deserializer)?;6667tuple.insert_boxed(value.into_partial_reflect());6869Ok(tuple)70}71}727374