Path: blob/main/crates/bevy_reflect/src/serde/ser/structs.rs
6600 views
use crate::{1serde::{ser::error_utils::make_custom_error, SerializationData, TypedReflectSerializer},2Struct, TypeInfo, TypeRegistry,3};4use serde::{ser::SerializeStruct, Serialize};56use super::ReflectSerializerProcessor;78/// A serializer for [`Struct`] values.9pub(super) struct StructSerializer<'a, P> {10pub struct_value: &'a dyn Struct,11pub registry: &'a TypeRegistry,12pub processor: Option<&'a P>,13}1415impl<P: ReflectSerializerProcessor> Serialize for StructSerializer<'_, P> {16fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>17where18S: serde::Serializer,19{20let type_info = self21.struct_value22.get_represented_type_info()23.ok_or_else(|| {24make_custom_error(format_args!(25"cannot get type info for `{}`",26self.struct_value.reflect_type_path()27))28})?;2930let struct_info = match type_info {31TypeInfo::Struct(struct_info) => struct_info,32info => {33return Err(make_custom_error(format_args!(34"expected 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);44let mut state = serializer.serialize_struct(45struct_info.type_path_table().ident().unwrap(),46self.struct_value.field_len() - ignored_len,47)?;4849for (index, value) in self.struct_value.iter_fields().enumerate() {50if serialization_data.is_some_and(|data| data.is_field_skipped(index)) {51continue;52}53let key = struct_info.field_at(index).unwrap().name();54state.serialize_field(55key,56&TypedReflectSerializer::new_internal(value, self.registry, self.processor),57)?;58}59state.end()60}61}626364