Skip to main content

shipyard/views/serde/de/
entities_mut.rs

1use crate::entity_id::EntityId;
2use crate::views::EntitiesViewMut;
3use core::fmt;
4use serde::de::{DeserializeSeed, Visitor};
5use serde::{Deserialize, Deserializer};
6
7/// Builder to customize [`EntitiesViewMut`]'s deserialization format.
8///
9/// Make sure to match the configuration used when serializing.
10pub struct EntitiesViewMutDeserializer<'tmp, 'view> {
11    entities: &'tmp mut EntitiesViewMut<'view>,
12}
13
14impl<'tmp, 'view> EntitiesViewMutDeserializer<'tmp, 'view> {
15    #[allow(missing_docs)]
16    pub fn new(
17        entities: &'tmp mut EntitiesViewMut<'view>,
18    ) -> EntitiesViewMutDeserializer<'tmp, 'view> {
19        EntitiesViewMutDeserializer { entities }
20    }
21}
22
23impl<'tmp, 'view, 'de: 'view> DeserializeSeed<'de> for EntitiesViewMutDeserializer<'tmp, 'view> {
24    type Value = ();
25
26    fn deserialize<D>(self, deserializer: D) -> Result<(), D::Error>
27    where
28        D: Deserializer<'de>,
29    {
30        struct SeqVisitor<'tmp, 'view> {
31            place: EntitiesViewMutDeserializer<'tmp, 'view>,
32        }
33
34        impl<'tmp2, 'tmp, 'view, 'de: 'view> Visitor<'de> for SeqVisitor<'tmp, 'view> {
35            type Value = ();
36
37            fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
38                formatter.write_str("a sequence of entity_id-component pairs")
39            }
40
41            fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
42            where
43                A: serde::de::SeqAccess<'de>,
44            {
45                while let Some(eid) = seq.next_element::<EntityId>()? {
46                    self.place.entities.spawn(eid);
47                }
48
49                Ok(())
50            }
51        }
52
53        deserializer.deserialize_seq(SeqVisitor { place: self })
54    }
55}
56
57impl<'view, 'de: 'view> Deserialize<'de> for EntitiesViewMut<'view> {
58    fn deserialize<D>(_deserializer: D) -> Result<Self, D::Error>
59    where
60        D: Deserializer<'de>,
61    {
62        panic!("EntitiesViewMut cannot be directly deserialized. Use deserialize_in_place instead.")
63    }
64
65    fn deserialize_in_place<D>(deserializer: D, place: &mut Self) -> Result<(), D::Error>
66    where
67        D: Deserializer<'de>,
68    {
69        let entities_view_mut_deserializer = EntitiesViewMutDeserializer::new(place);
70        DeserializeSeed::deserialize(entities_view_mut_deserializer, deserializer)
71    }
72}