bevy_reflect/serde/de/
lists.rs1use crate::{
2 list::{DynamicList, ListInfo},
3 serde::{de::registration_utils::try_get_registration, TypedReflectDeserializer},
4 TypeRegistry,
5};
6use core::{fmt, fmt::Formatter};
7use serde::de::{SeqAccess, Visitor};
8
9use super::ReflectDeserializerProcessor;
10
11pub(super) struct ListVisitor<'a, P> {
15 pub list_info: &'static ListInfo,
16 pub registry: &'a TypeRegistry,
17 pub processor: Option<&'a mut P>,
18}
19
20impl<'de, P: ReflectDeserializerProcessor> Visitor<'de> for ListVisitor<'_, P> {
21 type Value = DynamicList;
22
23 fn expecting(&self, formatter: &mut Formatter) -> fmt::Result {
24 formatter.write_str("reflected list value")
25 }
26
27 fn visit_seq<V>(mut self, mut seq: V) -> Result<Self::Value, V::Error>
28 where
29 V: SeqAccess<'de>,
30 {
31 let mut list = DynamicList::default();
32 let registration = try_get_registration(self.list_info.item_ty(), self.registry)?;
33 while let Some(value) = seq.next_element_seed(TypedReflectDeserializer::new_internal(
34 registration,
35 self.registry,
36 self.processor.as_deref_mut(),
37 ))? {
38 list.push_box(value);
39 }
40 Ok(list)
41 }
42}