You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

205 lines
5.9 KiB

  1. use std::any::type_name;
  2. use serde::{de::Deserializer, ser::Serializer};
  3. use shred::{Fetch, FetchMut, Resource};
  4. use shrev::{Event, EventChannel, ReaderId};
  5. use specs::{
  6. error::NoError,
  7. saveload::{ConvertSaveload, DeserializeComponents, Marker, SerializeComponents},
  8. Component, Entities, ReadStorage, World, WorldExt, Write, WriteStorage,
  9. };
  10. use crate::Error;
  11. /* WorldHelper */
  12. pub trait WorldHelper {
  13. fn resource<R>(&self) -> Result<Fetch<R>, Error>
  14. where
  15. R: Resource;
  16. fn resource_mut<R>(&self) -> Result<FetchMut<R>, Error>
  17. where
  18. R: Resource;
  19. fn register_event_reader<E>(&self) -> Result<ReaderId<E>, Error>
  20. where
  21. E: Event;
  22. fn serialize<T, S>(&self, persistence: T, serializer: S) -> Result<(), S::Error>
  23. where
  24. T: Persistence,
  25. S: Serializer;
  26. fn deserialize<'de, T, D>(&self, persistence: T, deserializer: D) -> Result<(), D::Error>
  27. where
  28. T: Persistence,
  29. D: Deserializer<'de>;
  30. }
  31. impl WorldHelper for World {
  32. fn resource<R>(&self) -> Result<Fetch<R>, Error>
  33. where
  34. R: Resource,
  35. {
  36. self.try_fetch::<R>()
  37. .ok_or_else(|| Error::ResourceNotRegistered(type_name::<R>()))
  38. }
  39. fn resource_mut<R>(&self) -> Result<FetchMut<R>, Error>
  40. where
  41. R: Resource,
  42. {
  43. self.try_fetch_mut::<R>()
  44. .ok_or_else(|| Error::ResourceNotRegistered(type_name::<R>()))
  45. }
  46. fn register_event_reader<E>(&self) -> Result<ReaderId<E>, Error>
  47. where
  48. E: Event,
  49. {
  50. Ok(self.resource_mut::<EventChannel<E>>()?.register_reader())
  51. }
  52. fn serialize<T, S>(&self, persistence: T, serializer: S) -> Result<(), S::Error>
  53. where
  54. T: Persistence,
  55. S: Serializer,
  56. {
  57. persistence.serialize(self, serializer)
  58. }
  59. fn deserialize<'de, T, D>(&self, persistence: T, deserializer: D) -> Result<(), D::Error>
  60. where
  61. T: Persistence,
  62. D: Deserializer<'de>,
  63. {
  64. persistence.deserialize(self, deserializer)
  65. }
  66. }
  67. /* Persistence */
  68. pub trait Persistence {
  69. type Marker: Marker;
  70. type Components: PersistenceComponents<Self::Marker>;
  71. fn setup(world: &mut World)
  72. where
  73. <Self::Marker as Component>::Storage: Default,
  74. <Self::Marker as Marker>::Allocator: Default,
  75. {
  76. world.register::<Self::Marker>();
  77. world.insert(<Self::Marker as Marker>::Allocator::default());
  78. }
  79. fn serialize<S>(&self, world: &World, serializer: S) -> Result<(), S::Error>
  80. where
  81. S: Serializer,
  82. {
  83. Self::Components::serialize(world, serializer)
  84. }
  85. fn deserialize<'de, D>(&self, world: &World, deserializer: D) -> Result<(), D::Error>
  86. where
  87. D: Deserializer<'de>,
  88. {
  89. Self::Components::deserialize(world, deserializer)
  90. }
  91. }
  92. /* PersistenceComponents */
  93. pub trait PersistenceComponents<M>
  94. where
  95. M: Marker,
  96. {
  97. fn serialize<S>(world: &World, serializer: S) -> Result<(), S::Error>
  98. where
  99. S: Serializer;
  100. fn deserialize<'de, D>(world: &World, deserializer: D) -> Result<(), D::Error>
  101. where
  102. D: Deserializer<'de>;
  103. }
  104. macro_rules! define_persistence_components {
  105. ($($T:ident),*) => {
  106. #[allow(non_snake_case)]
  107. impl<M $(,$T)+> PersistenceComponents<M> for ($($T,)+)
  108. where
  109. M: Marker,
  110. M::Allocator: Default,
  111. $($T: Component + ConvertSaveload<M, Error = NoError>,)+
  112. {
  113. fn serialize<S>(world: &World, serializer: S) -> Result<(), S::Error>
  114. where
  115. S: Serializer,
  116. {
  117. let (
  118. entities,
  119. mut marker,
  120. mut allocator,
  121. $($T,)+
  122. ) = world.system_data::<(
  123. Entities,
  124. WriteStorage<M>,
  125. Write<M::Allocator>,
  126. $(ReadStorage<$T>,
  127. )+)>();
  128. SerializeComponents::<NoError, M>::serialize_recursive
  129. (&($($T,)+),
  130. &entities,
  131. &mut marker,
  132. &mut allocator,
  133. serializer,
  134. )?;
  135. Ok(())
  136. }
  137. fn deserialize<'de, D>(world: &World, deserializer: D) -> Result<(), D::Error>
  138. where
  139. D: Deserializer<'de>,
  140. {
  141. let (
  142. entities,
  143. mut marker,
  144. mut allocator,
  145. $($T,)+
  146. ) = world.system_data::<(
  147. Entities,
  148. WriteStorage<M>,
  149. Write<M::Allocator>,
  150. $(WriteStorage<$T>,)+
  151. )>();
  152. DeserializeComponents::<NoError, M>::deserialize(
  153. &mut ($($T,)+),
  154. &entities,
  155. &mut marker,
  156. &mut allocator,
  157. deserializer,
  158. )
  159. }
  160. }
  161. }
  162. }
  163. define_persistence_components!(T1);
  164. define_persistence_components!(T1, T2);
  165. define_persistence_components!(T1, T2, T3);
  166. define_persistence_components!(T1, T2, T3, T4);
  167. define_persistence_components!(T1, T2, T3, T4, T5);
  168. define_persistence_components!(T1, T2, T3, T4, T5, T6);
  169. define_persistence_components!(T1, T2, T3, T4, T5, T6, T7);
  170. define_persistence_components!(T1, T2, T3, T4, T5, T6, T7, T8);
  171. define_persistence_components!(T1, T2, T3, T4, T5, T6, T7, T8, T9);
  172. define_persistence_components!(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10);
  173. define_persistence_components!(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11);
  174. define_persistence_components!(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12);
  175. define_persistence_components!(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13);
  176. define_persistence_components!(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14);
  177. define_persistence_components!(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15);