Path: blob/main/crates/bevy_reflect/src/serde/de/arrays.rs
6600 views
use crate::{1serde::{de::registration_utils::try_get_registration, TypedReflectDeserializer},2ArrayInfo, DynamicArray, TypeRegistry,3};4use alloc::{string::ToString, vec::Vec};5use core::{fmt, fmt::Formatter};6use serde::de::{Error, SeqAccess, Visitor};78use super::ReflectDeserializerProcessor;910/// A [`Visitor`] for deserializing [`Array`] values.11///12/// [`Array`]: crate::Array13pub(super) struct ArrayVisitor<'a, P> {14pub array_info: &'static ArrayInfo,15pub registry: &'a TypeRegistry,16pub processor: Option<&'a mut P>,17}1819impl<'de, P: ReflectDeserializerProcessor> Visitor<'de> for ArrayVisitor<'_, P> {20type Value = DynamicArray;2122fn expecting(&self, formatter: &mut Formatter) -> fmt::Result {23formatter.write_str("reflected array value")24}2526fn visit_seq<V>(mut self, mut seq: V) -> Result<Self::Value, V::Error>27where28V: SeqAccess<'de>,29{30let mut vec = Vec::with_capacity(seq.size_hint().unwrap_or_default());31let registration = try_get_registration(self.array_info.item_ty(), self.registry)?;32while let Some(value) = seq.next_element_seed(TypedReflectDeserializer::new_internal(33registration,34self.registry,35self.processor.as_deref_mut(),36))? {37vec.push(value);38}3940if vec.len() != self.array_info.capacity() {41return Err(Error::invalid_length(42vec.len(),43&self.array_info.capacity().to_string().as_str(),44));45}4647Ok(DynamicArray::new(vec.into_boxed_slice()))48}49}505152