bevy_reflect/serde/de/
lists.rs

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