Skip to main content

bevy_reflect/serde/de/
lists.rs

1use 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
11/// A [`Visitor`] for deserializing [`List`] values.
12///
13/// [`List`]: crate::list::List
14pub(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}