shipyard/views/serde/de/
entities_mut.rs1use crate::entity_id::EntityId;
2use crate::views::EntitiesViewMut;
3use core::fmt;
4use serde::de::{DeserializeSeed, Visitor};
5use serde::{Deserialize, Deserializer};
6
7pub 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}