Path: blob/main/crates/bevy_reflect/src/serde/de/tuple_utils.rs
9395 views
use crate::{1enums::TupleVariantInfo,2serde::{3de::{error_utils::make_custom_error, registration_utils::try_get_registration},4SerializationData, TypedReflectDeserializer,5},6tuple::{DynamicTuple, TupleInfo},7tuple_struct::TupleStructInfo,8TypeRegistration, TypeRegistry, UnnamedField,9};10use alloc::string::ToString;11use serde::de::{Error, SeqAccess};1213use super::ReflectDeserializerProcessor;1415pub(super) trait TupleLikeInfo {16fn field_at<E: Error>(&self, index: usize) -> Result<&UnnamedField, E>;17fn field_len(&self) -> usize;18}1920impl TupleLikeInfo for TupleInfo {21fn field_len(&self) -> usize {22Self::field_len(self)23}2425fn field_at<E: Error>(&self, index: usize) -> Result<&UnnamedField, E> {26Self::field_at(self, index).ok_or_else(|| {27make_custom_error(format_args!(28"no field at index `{}` on tuple `{}`",29index,30self.type_path(),31))32})33}34}3536impl TupleLikeInfo for TupleStructInfo {37fn field_len(&self) -> usize {38Self::field_len(self)39}4041fn field_at<E: Error>(&self, index: usize) -> Result<&UnnamedField, E> {42Self::field_at(self, index).ok_or_else(|| {43make_custom_error(format_args!(44"no field at index `{}` on tuple struct `{}`",45index,46self.type_path(),47))48})49}50}5152impl TupleLikeInfo for TupleVariantInfo {53fn field_len(&self) -> usize {54Self::field_len(self)55}5657fn field_at<E: Error>(&self, index: usize) -> Result<&UnnamedField, E> {58Self::field_at(self, index).ok_or_else(|| {59make_custom_error(format_args!(60"no field at index `{}` on tuple variant `{}`",61index,62self.name(),63))64})65}66}6768/// Deserializes a [tuple-like] type from a sequence of elements, returning a [`DynamicTuple`].69///70/// [tuple-like]: TupleLikeInfo71pub(super) fn visit_tuple<'de, T, V, P>(72seq: &mut V,73info: &T,74registration: &TypeRegistration,75registry: &TypeRegistry,76mut processor: Option<&mut P>,77) -> Result<DynamicTuple, V::Error>78where79T: TupleLikeInfo,80V: SeqAccess<'de>,81P: ReflectDeserializerProcessor,82{83let mut tuple = DynamicTuple::default();8485let len = info.field_len();8687if len == 0 {88// Handle empty tuple/tuple struct89return Ok(tuple);90}9192let serialization_data = registration.data::<SerializationData>();9394for index in 0..len {95if let Some(value) = serialization_data.and_then(|data| data.generate_default(index)) {96tuple.insert_boxed(value.into_partial_reflect());97continue;98}99100let value = seq101.next_element_seed(TypedReflectDeserializer::new_internal(102try_get_registration(*info.field_at(index)?.ty(), registry)?,103registry,104processor.as_deref_mut(),105))?106.ok_or_else(|| Error::invalid_length(index, &len.to_string().as_str()))?;107tuple.insert_boxed(value);108}109110Ok(tuple)111}112113114