Path: blob/main/crates/bevy_reflect/src/serde/de/tuple_utils.rs
6600 views
use crate::{1serde::{2de::{error_utils::make_custom_error, registration_utils::try_get_registration},3SerializationData, TypedReflectDeserializer,4},5DynamicTuple, TupleInfo, TupleStructInfo, TupleVariantInfo, TypeRegistration, TypeRegistry,6UnnamedField,7};8use alloc::string::ToString;9use serde::de::{Error, SeqAccess};1011use super::ReflectDeserializerProcessor;1213pub(super) trait TupleLikeInfo {14fn field_at<E: Error>(&self, index: usize) -> Result<&UnnamedField, E>;15fn field_len(&self) -> usize;16}1718impl TupleLikeInfo for TupleInfo {19fn field_len(&self) -> usize {20Self::field_len(self)21}2223fn field_at<E: Error>(&self, index: usize) -> Result<&UnnamedField, E> {24Self::field_at(self, index).ok_or_else(|| {25make_custom_error(format_args!(26"no field at index `{}` on tuple `{}`",27index,28self.type_path(),29))30})31}32}3334impl TupleLikeInfo for TupleStructInfo {35fn field_len(&self) -> usize {36Self::field_len(self)37}3839fn field_at<E: Error>(&self, index: usize) -> Result<&UnnamedField, E> {40Self::field_at(self, index).ok_or_else(|| {41make_custom_error(format_args!(42"no field at index `{}` on tuple struct `{}`",43index,44self.type_path(),45))46})47}48}4950impl TupleLikeInfo for TupleVariantInfo {51fn field_len(&self) -> usize {52Self::field_len(self)53}5455fn field_at<E: Error>(&self, index: usize) -> Result<&UnnamedField, E> {56Self::field_at(self, index).ok_or_else(|| {57make_custom_error(format_args!(58"no field at index `{}` on tuple variant `{}`",59index,60self.name(),61))62})63}64}6566/// Deserializes a [tuple-like] type from a sequence of elements, returning a [`DynamicTuple`].67///68/// [tuple-like]: TupleLikeInfo69pub(super) fn visit_tuple<'de, T, V, P>(70seq: &mut V,71info: &T,72registration: &TypeRegistration,73registry: &TypeRegistry,74mut processor: Option<&mut P>,75) -> Result<DynamicTuple, V::Error>76where77T: TupleLikeInfo,78V: SeqAccess<'de>,79P: ReflectDeserializerProcessor,80{81let mut tuple = DynamicTuple::default();8283let len = info.field_len();8485if len == 0 {86// Handle empty tuple/tuple struct87return Ok(tuple);88}8990let serialization_data = registration.data::<SerializationData>();9192for index in 0..len {93if let Some(value) = serialization_data.and_then(|data| data.generate_default(index)) {94tuple.insert_boxed(value.into_partial_reflect());95continue;96}9798let value = seq99.next_element_seed(TypedReflectDeserializer::new_internal(100try_get_registration(*info.field_at(index)?.ty(), registry)?,101registry,102processor.as_deref_mut(),103))?104.ok_or_else(|| Error::invalid_length(index, &len.to_string().as_str()))?;105tuple.insert_boxed(value);106}107108Ok(tuple)109}110111112