Path: blob/main/crates/bevy_reflect/src/serde/ser/tuple_structs.rs
9374 views
use crate::{1serde::{ser::error_utils::make_custom_error, SerializationData, TypedReflectSerializer},2tuple_struct::TupleStruct,3TypeInfo, TypeRegistry,4};5use serde::{ser::SerializeTupleStruct, Serialize};67use super::ReflectSerializerProcessor;89/// A serializer for [`TupleStruct`] values.10pub(super) struct TupleStructSerializer<'a, P> {11pub tuple_struct: &'a dyn TupleStruct,12pub registry: &'a TypeRegistry,13pub processor: Option<&'a P>,14}1516impl<P: ReflectSerializerProcessor> Serialize for TupleStructSerializer<'_, P> {17fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>18where19S: serde::Serializer,20{21let type_info = self22.tuple_struct23.get_represented_type_info()24.ok_or_else(|| {25make_custom_error(format_args!(26"cannot get type info for `{}`",27self.tuple_struct.reflect_type_path()28))29})?;3031let tuple_struct_info = match type_info {32TypeInfo::TupleStruct(tuple_struct_info) => tuple_struct_info,33info => {34return Err(make_custom_error(format_args!(35"expected tuple struct type but received {info:?}"36)));37}38};3940let serialization_data = self41.registry42.get(type_info.type_id())43.and_then(|registration| registration.data::<SerializationData>());44let ignored_len = serialization_data.map(SerializationData::len).unwrap_or(0);4546if self.tuple_struct.field_len() == 1 && serialization_data.is_none() {47let field = self.tuple_struct.field(0).unwrap();48return serializer.serialize_newtype_struct(49tuple_struct_info.type_path_table().ident().unwrap(),50&TypedReflectSerializer::new_internal(field, self.registry, self.processor),51);52}5354let mut state = serializer.serialize_tuple_struct(55tuple_struct_info.type_path_table().ident().unwrap(),56self.tuple_struct.field_len() - ignored_len,57)?;5859for (index, value) in self.tuple_struct.iter_fields().enumerate() {60if serialization_data.is_some_and(|data| data.is_field_skipped(index)) {61continue;62}63state.serialize_field(&TypedReflectSerializer::new_internal(64value,65self.registry,66self.processor,67))?;68}69state.end()70}71}727374