1use std::{collections::HashMap, hash::Hash, marker::PhantomData};
4
5use de::{WorldDeserializer, WorldVisitor};
6use id::EntitySerializer;
7use ser::WorldSerializer;
8use serde::{de::DeserializeSeed, Serializer};
9
10use crate::{
11 internals::{
12 storage::{
13 archetype::{ArchetypeIndex, EntityLayout},
14 component::{Component, ComponentTypeId},
15 UnknownComponentStorage,
16 },
17 world::World,
18 },
19 storage::UnknownComponentWriter,
20};
21
22pub mod archetypes;
23pub mod de;
24mod entities;
25pub mod id;
26pub mod ser;
27
28pub trait TypeKey:
32 serde::Serialize + for<'de> serde::Deserialize<'de> + Ord + Clone + Hash
33{
34}
35
36impl<T> TypeKey for T where
37 T: serde::Serialize + for<'de> serde::Deserialize<'de> + Ord + Clone + Hash
38{
39}
40pub trait AutoTypeKey<T: Component>: TypeKey {
42 fn new() -> Self;
44}
45
46type SerializeFn = fn(*const u8, &mut dyn FnMut(&dyn erased_serde::Serialize));
47type SerializeSliceFn =
48 fn(&dyn UnknownComponentStorage, ArchetypeIndex, &mut dyn FnMut(&dyn erased_serde::Serialize));
49type DeserializeSliceFn = fn(
50 UnknownComponentWriter,
51 &mut dyn erased_serde::Deserializer,
52) -> Result<(), erased_serde::Error>;
53type DeserializeSingleBoxedFn =
54 fn(&mut dyn erased_serde::Deserializer) -> Result<Box<[u8]>, erased_serde::Error>;
55
56#[derive(Copy, Clone)]
57pub enum UnknownType {
59 Ignore,
61 Error,
63}
64
65pub struct Registry<T>
74where
75 T: TypeKey,
76{
77 _phantom_t: PhantomData<T>,
78 missing: UnknownType,
79 serialize_fns: HashMap<
80 ComponentTypeId,
81 (
82 T,
83 SerializeSliceFn,
84 SerializeFn,
85 DeserializeSliceFn,
86 DeserializeSingleBoxedFn,
87 ),
88 >,
89 constructors: HashMap<T, (ComponentTypeId, fn(&mut EntityLayout))>,
90}
91
92impl<T> Registry<T>
93where
94 T: TypeKey,
95{
96 pub fn new() -> Self {
98 Self {
99 missing: UnknownType::Error,
100 serialize_fns: HashMap::new(),
101 constructors: HashMap::new(),
102 _phantom_t: PhantomData,
103 }
104 }
105
106 pub fn on_unknown(&mut self, unknown: UnknownType) {
108 self.missing = unknown;
109 }
110
111 pub fn register<C: Component + serde::Serialize + for<'de> serde::Deserialize<'de>>(
113 &mut self,
114 mapped_type_id: T,
115 ) {
116 let type_id = ComponentTypeId::of::<C>();
117 let serialize_slice_fn =
118 |storage: &dyn UnknownComponentStorage,
119 archetype,
120 serialize: &mut dyn FnMut(&dyn erased_serde::Serialize)| unsafe {
121 let (ptr, len) = storage.get_raw(archetype).unwrap();
122 let slice = std::slice::from_raw_parts(ptr as *const C, len);
123 (serialize)(&slice);
124 };
125 let serialize_fn = |ptr, serialize: &mut dyn FnMut(&dyn erased_serde::Serialize)| {
126 let component = unsafe { &*(ptr as *const C) };
127 (serialize)(component);
128 };
129 let deserialize_slice_fn =
130 |storage: UnknownComponentWriter, deserializer: &mut dyn erased_serde::Deserializer| {
131 ComponentSeq::<C> {
133 storage,
134 _phantom: PhantomData,
135 }
136 .deserialize(deserializer)?;
137 Ok(())
138 };
139 let deserialize_single_boxed_fn = |deserializer: &mut dyn erased_serde::Deserializer| {
140 let component = erased_serde::deserialize::<C>(deserializer)?;
141 unsafe {
142 let vec = std::slice::from_raw_parts(
143 &component as *const C as *const u8,
144 std::mem::size_of::<C>(),
145 )
146 .to_vec();
147 std::mem::forget(component);
148 Ok(vec.into_boxed_slice())
149 }
150 };
151 let constructor_fn = |layout: &mut EntityLayout| layout.register_component::<C>();
152 self.serialize_fns.insert(
153 type_id,
154 (
155 mapped_type_id.clone(),
156 serialize_slice_fn,
157 serialize_fn,
158 deserialize_slice_fn,
159 deserialize_single_boxed_fn,
160 ),
161 );
162 self.constructors
163 .insert(mapped_type_id, (type_id, constructor_fn));
164 }
165
166 pub fn register_auto_mapped<
168 C: Component + serde::Serialize + for<'de> serde::Deserialize<'de>,
169 >(
170 &mut self,
171 ) where
172 T: AutoTypeKey<C>,
173 {
174 self.register::<C>(<T as AutoTypeKey<C>>::new())
175 }
176
177 pub fn as_deserialize_into_world<'a, E: EntitySerializer>(
179 &'a self,
180 world: &'a mut World,
181 entity_serializer: &'a E,
182 ) -> DeserializeIntoWorld<'a, Self, E> {
183 DeserializeIntoWorld {
184 world,
185 world_deserializer: self,
186 entity_serializer,
187 }
188 }
189
190 pub fn as_deserialize<'a, E: EntitySerializer>(
192 &'a self,
193 entity_serializer: &'a E,
194 ) -> DeserializeNewWorld<'a, Self, E> {
195 DeserializeNewWorld {
196 world_deserializer: self,
197 entity_serializer,
198 }
199 }
200}
201
202impl<T> Default for Registry<T>
203where
204 T: TypeKey,
205{
206 #[inline]
207 fn default() -> Self {
208 Self::new()
209 }
210}
211
212impl<T> WorldSerializer for Registry<T>
213where
214 T: TypeKey,
215{
216 type TypeId = T;
217
218 unsafe fn serialize_component<Ser: Serializer>(
219 &self,
220 ty: ComponentTypeId,
221 ptr: *const u8,
222 serializer: Ser,
223 ) -> Result<Ser::Ok, Ser::Error> {
224 if let Some((_, _, serialize_fn, _, _)) = self.serialize_fns.get(&ty) {
225 let mut serializer = Some(serializer);
226 let mut result = None;
227 let result_ref = &mut result;
228 (serialize_fn)(ptr, &mut move |serializable| {
229 *result_ref = Some(erased_serde::serialize(
230 serializable,
231 serializer
232 .take()
233 .expect("serialize can only be called once"),
234 ));
235 });
236 result.unwrap()
237 } else {
238 panic!();
239 }
240 }
241
242 fn map_id(&self, type_id: ComponentTypeId) -> Result<Self::TypeId, UnknownType> {
243 if let Some(type_id) = self
244 .serialize_fns
245 .get(&type_id)
246 .map(|(type_id, _, _, _, _)| type_id.clone())
247 {
248 Ok(type_id)
249 } else {
250 Err(self.missing)
251 }
252 }
253
254 unsafe fn serialize_component_slice<Ser: Serializer>(
255 &self,
256 ty: ComponentTypeId,
257 storage: &dyn UnknownComponentStorage,
258 archetype: ArchetypeIndex,
259 serializer: Ser,
260 ) -> Result<Ser::Ok, Ser::Error> {
261 if let Some((_, serialize_fn, _, _, _)) = self.serialize_fns.get(&ty) {
262 let mut serializer = Some(serializer);
263 let mut result = None;
264 let result_ref = &mut result;
265 (serialize_fn)(storage, archetype, &mut move |serializable| {
266 *result_ref = Some(erased_serde::serialize(
267 serializable,
268 serializer
269 .take()
270 .expect("serialize can only be called once"),
271 ));
272 });
273 result.unwrap()
274 } else {
275 panic!();
276 }
277 }
278}
279
280impl<T> WorldDeserializer for Registry<T>
281where
282 T: TypeKey,
283{
284 type TypeId = T;
285
286 fn unmap_id(&self, type_id: &Self::TypeId) -> Result<ComponentTypeId, UnknownType> {
287 if let Some(type_id) = self.constructors.get(type_id).map(|(id, _)| *id) {
288 Ok(type_id)
289 } else {
290 Err(self.missing)
291 }
292 }
293
294 fn register_component(&self, type_id: Self::TypeId, layout: &mut EntityLayout) {
295 if let Some((_, constructor)) = self.constructors.get(&type_id) {
296 (constructor)(layout);
297 }
298 }
299
300 fn deserialize_component_slice<'a, 'de, D: serde::Deserializer<'de>>(
301 &self,
302 type_id: ComponentTypeId,
303 storage: UnknownComponentWriter<'a>,
304 deserializer: D,
305 ) -> Result<(), D::Error> {
306 if let Some((_, _, _, deserialize, _)) = self.serialize_fns.get(&type_id) {
307 use serde::de::Error;
308 let mut deserializer = erased_serde::Deserializer::erase(deserializer);
309 (deserialize)(storage, &mut deserializer).map_err(D::Error::custom)
310 } else {
311 panic!()
313 }
314 }
315
316 fn deserialize_component<'de, D: serde::Deserializer<'de>>(
317 &self,
318 type_id: ComponentTypeId,
319 deserializer: D,
320 ) -> Result<Box<[u8]>, D::Error> {
321 if let Some((_, _, _, _, deserialize)) = self.serialize_fns.get(&type_id) {
322 use serde::de::Error;
323 let mut deserializer = erased_serde::Deserializer::erase(deserializer);
324 (deserialize)(&mut deserializer).map_err(D::Error::custom)
325 } else {
326 panic!()
328 }
329 }
330}
331
332struct ComponentSeq<'a, T: Component> {
333 storage: UnknownComponentWriter<'a>,
334 _phantom: PhantomData<T>,
335}
336
337impl<'a, 'de, T: Component + for<'b> serde::de::Deserialize<'b>> serde::de::DeserializeSeed<'de>
338 for ComponentSeq<'a, T>
339{
340 type Value = ();
341
342 fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
343 where
344 D: serde::de::Deserializer<'de>,
345 {
346 struct SeqVisitor<'b, C: Component + for<'c> serde::de::Deserialize<'c>> {
347 storage: UnknownComponentWriter<'b>,
348 _phantom: PhantomData<C>,
349 }
350
351 impl<'b, 'de, C: Component + for<'c> serde::de::Deserialize<'c>> serde::de::Visitor<'de>
352 for SeqVisitor<'b, C>
353 {
354 type Value = ();
355
356 fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
357 formatter.write_str("component seq")
358 }
359
360 fn visit_seq<V>(mut self, mut seq: V) -> Result<Self::Value, V::Error>
361 where
362 V: serde::de::SeqAccess<'de>,
363 {
364 if let Some(len) = seq.size_hint() {
365 self.storage.ensure_capacity(len);
366 }
367
368 while let Some(component) = seq.next_element::<C>()? {
369 unsafe {
370 let ptr = &component as *const C as *const u8;
371 self.storage.extend_memcopy_raw(ptr, 1);
372 std::mem::forget(component)
373 }
374 }
375 Ok(())
376 }
377 }
378
379 deserializer.deserialize_seq(SeqVisitor::<T> {
380 storage: self.storage,
381 _phantom: PhantomData,
382 })
383 }
384}
385
386pub struct DeserializeIntoWorld<'a, W: WorldDeserializer, E: EntitySerializer> {
389 pub world: &'a mut World,
391 pub world_deserializer: &'a W,
393 pub entity_serializer: &'a E,
395}
396
397impl<'a, 'de, W: WorldDeserializer, E: EntitySerializer> DeserializeSeed<'de>
398 for DeserializeIntoWorld<'a, W, E>
399{
400 type Value = ();
401
402 fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
403 where
404 D: serde::Deserializer<'de>,
405 {
406 deserializer.deserialize_map(WorldVisitor {
407 world: self.world,
408 world_deserializer: self.world_deserializer,
409 entity_serializer: self.entity_serializer,
410 })
411 }
412}
413
414pub struct DeserializeNewWorld<'a, W: WorldDeserializer, E: EntitySerializer> {
417 pub world_deserializer: &'a W,
419 pub entity_serializer: &'a E,
421}
422
423impl<'a, 'de, W: WorldDeserializer, E: EntitySerializer> DeserializeSeed<'de>
424 for DeserializeNewWorld<'a, W, E>
425{
426 type Value = World;
427
428 fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
429 where
430 D: serde::Deserializer<'de>,
431 {
432 let mut world = World::default();
433 DeserializeIntoWorld {
434 world: &mut world,
435 world_deserializer: self.world_deserializer,
436 entity_serializer: self.entity_serializer,
437 }
438 .deserialize(deserializer)?;
439 Ok(world)
440 }
441}
442
443#[derive(serde::Serialize, serde::Deserialize)]
444#[serde(rename_all = "lowercase")]
445enum WorldField {
446 Packed,
447 Entities,
448}
449
450#[cfg(test)]
451mod test {
452 use super::Registry;
453 use crate::internals::{
454 entity::Entity,
455 query::filter::filter_fns::any,
456 serialize::id::{set_entity_serializer, Canon},
457 world::{EntityStore, World},
458 };
459
460 #[test]
461 fn serialize_json() {
462 let mut world = World::default();
463
464 let entity = world.extend(vec![
465 (1usize, false, 1isize),
466 (2usize, false, 2isize),
467 (3usize, false, 3isize),
468 (4usize, false, 4isize),
469 ])[0];
470
471 #[derive(serde::Serialize, serde::Deserialize)]
472 struct EntityRef(Entity);
473
474 let with_ref = world.extend(vec![
475 (5usize, 5isize, EntityRef(entity)),
476 (6usize, 6isize, EntityRef(entity)),
477 (7usize, 7isize, EntityRef(entity)),
478 (8usize, 8isize, EntityRef(entity)),
479 ])[0];
480
481 let entity_serializer = Canon::default();
482 let mut registry = Registry::<String>::default();
483 registry.register::<usize>("usize".to_string());
484 registry.register::<bool>("bool".to_string());
485 registry.register::<isize>("isize".to_string());
486 registry.register::<EntityRef>("entity_ref".to_string());
487
488 let json =
489 serde_json::to_value(&world.as_serializable(any(), ®istry, &entity_serializer))
490 .unwrap();
491 println!("{:#}", json);
492
493 use serde::de::DeserializeSeed;
494 let world: World = registry
495 .as_deserialize(&entity_serializer)
496 .deserialize(json)
497 .unwrap();
498 let entry = world.entry_ref(entity).unwrap();
499 assert_eq!(entry.get_component::<usize>().unwrap(), &1usize);
500 assert_eq!(entry.get_component::<bool>().unwrap(), &false);
501 assert_eq!(entry.get_component::<isize>().unwrap(), &1isize);
502 assert_eq!(
503 world
504 .entry_ref(with_ref)
505 .unwrap()
506 .get_component::<EntityRef>()
507 .unwrap()
508 .0,
509 entity
510 );
511
512 assert_eq!(8, world.len());
513 }
514
515 #[test]
516 fn serialize_bincode() {
517 let mut world = World::default();
518
519 let entity = world.extend(vec![
520 (1usize, false, 1isize),
521 (2usize, false, 2isize),
522 (3usize, false, 3isize),
523 (4usize, false, 4isize),
524 ])[0];
525
526 world.extend(vec![
527 (5usize, 5isize),
528 (6usize, 6isize),
529 (7usize, 7isize),
530 (8usize, 8isize),
531 ]);
532
533 let entity_serializer = Canon::default();
534 let mut registry = Registry::<i32>::default();
535 registry.register::<usize>(1);
536 registry.register::<bool>(2);
537 registry.register::<isize>(3);
538
539 let encoded =
540 bincode::serialize(&world.as_serializable(any(), ®istry, &entity_serializer))
541 .unwrap();
542
543 use bincode::config::Options;
544 use serde::de::DeserializeSeed;
545 let mut deserializer = bincode::de::Deserializer::from_slice(
546 &encoded[..],
547 bincode::config::DefaultOptions::new()
548 .with_fixint_encoding()
549 .allow_trailing_bytes(),
550 );
551 let world: World = registry
552 .as_deserialize(&entity_serializer)
553 .deserialize(&mut deserializer)
554 .unwrap();
555 let entity = world.entry_ref(entity).unwrap();
556 assert_eq!(entity.get_component::<usize>().unwrap(), &1usize);
557 assert_eq!(entity.get_component::<bool>().unwrap(), &false);
558 assert_eq!(entity.get_component::<isize>().unwrap(), &1isize);
559
560 assert_eq!(8, world.len());
561 }
562
563 #[test]
564 fn run_as_context_panic() {
565 std::panic::catch_unwind(|| {
566 let entity_serializer = Canon::default();
567 set_entity_serializer(&entity_serializer, || panic!());
568 })
569 .unwrap_err();
570
571 serialize_bincode();
573 }
574
575 #[test]
576 fn serialize_json_external_canon() {
577 let mut world1 = World::default();
578
579 let entity = world1.extend(vec![
580 (1usize, false, 1isize),
581 (2usize, false, 2isize),
582 (3usize, false, 3isize),
583 (4usize, false, 4isize),
584 ])[0];
585
586 #[derive(serde::Serialize, serde::Deserialize)]
587 struct EntityRef(Entity);
588
589 let with_ref = world1.extend(vec![
590 (5usize, 5isize, EntityRef(entity)),
591 (6usize, 6isize, EntityRef(entity)),
592 (7usize, 7isize, EntityRef(entity)),
593 (8usize, 8isize, EntityRef(entity)),
594 ])[0];
595
596 let entity_serializer = Canon::default();
597 let mut registry = Registry::<String>::new();
598 registry.register::<usize>("usize".to_string());
599 registry.register::<bool>("bool".to_string());
600 registry.register::<isize>("isize".to_string());
601 registry.register::<EntityRef>("entity_ref".to_string());
602
603 let json =
604 serde_json::to_value(&world1.as_serializable(any(), ®istry, &entity_serializer))
605 .unwrap();
606 println!("{:#}", json);
607
608 let entityname = entity_serializer.get_name(entity).unwrap();
609 assert_eq!(entity_serializer.get_id(&entityname).unwrap(), entity);
610
611 use serde::de::DeserializeSeed;
612 let world2: World = registry
613 .as_deserialize(&entity_serializer)
614 .deserialize(json)
615 .unwrap();
616 let entry = world2.entry_ref(entity).unwrap();
617 assert_eq!(entry.get_component::<usize>().unwrap(), &1usize);
618 assert_eq!(entry.get_component::<bool>().unwrap(), &false);
619 assert_eq!(entry.get_component::<isize>().unwrap(), &1isize);
620 assert_eq!(
621 world2
622 .entry_ref(with_ref)
623 .unwrap()
624 .get_component::<EntityRef>()
625 .unwrap()
626 .0,
627 entity
628 );
629
630 assert_eq!(8, world2.len());
631 }
632}