Path: blob/main/crates/bevy_reflect/src/serde/ser/tuple_structs.rs
6600 views
use crate::{1serde::{ser::error_utils::make_custom_error, SerializationData, TypedReflectSerializer},2TupleStruct, TypeInfo, TypeRegistry,3};4use serde::{ser::SerializeTupleStruct, Serialize};56use super::ReflectSerializerProcessor;78/// A serializer for [`TupleStruct`] values.9pub(super) struct TupleStructSerializer<'a, P> {10pub tuple_struct: &'a dyn TupleStruct,11pub registry: &'a TypeRegistry,12pub processor: Option<&'a P>,13}1415impl<P: ReflectSerializerProcessor> Serialize for TupleStructSerializer<'_, P> {16fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>17where18S: serde::Serializer,19{20let type_info = self21.tuple_struct22.get_represented_type_info()23.ok_or_else(|| {24make_custom_error(format_args!(25"cannot get type info for `{}`",26self.tuple_struct.reflect_type_path()27))28})?;2930let tuple_struct_info = match type_info {31TypeInfo::TupleStruct(tuple_struct_info) => tuple_struct_info,32info => {33return Err(make_custom_error(format_args!(34"expected tuple struct type but received {info:?}"35)));36}37};3839let serialization_data = self40.registry41.get(type_info.type_id())42.and_then(|registration| registration.data::<SerializationData>());43let ignored_len = serialization_data.map(SerializationData::len).unwrap_or(0);4445if self.tuple_struct.field_len() == 1 && serialization_data.is_none() {46let field = self.tuple_struct.field(0).unwrap();47return serializer.serialize_newtype_struct(48tuple_struct_info.type_path_table().ident().unwrap(),49&TypedReflectSerializer::new_internal(field, self.registry, self.processor),50);51}5253let mut state = serializer.serialize_tuple_struct(54tuple_struct_info.type_path_table().ident().unwrap(),55self.tuple_struct.field_len() - ignored_len,56)?;5758for (index, value) in self.tuple_struct.iter_fields().enumerate() {59if serialization_data.is_some_and(|data| data.is_field_skipped(index)) {60continue;61}62state.serialize_field(&TypedReflectSerializer::new_internal(63value,64self.registry,65self.processor,66))?;67}68state.end()69}70}717273