live_entity/
singleton_entity.rs

1use std::fmt::Debug;
2
3use serde::{de::DeserializeOwned, Serialize, Deserialize};
4
5use crate::{Entity, UpdateTrait, Updatable};
6
7pub trait Singleton: Updatable<Self::Update> + Debug + Clone + Serialize + DeserializeOwned + Unpin + Send + Sync + 'static {
8  type Update: UpdateTrait;
9  const ENTITY_ID: &'static str;
10  const TYPE_NAME: &'static str;
11}
12
13#[derive(Clone)]
14pub struct SingletonEntity<S: Singleton>(pub(crate) S, String);
15impl<S: Singleton> SingletonEntity<S> {
16  pub fn new(singleton: S) -> Self {
17    Self(singleton, S::ENTITY_ID.to_owned())
18  }
19}
20#[derive(Clone)]
21pub struct SingletonEntityUpdate<S: Singleton>(pub(crate) S::Update);
22impl<S: Singleton> Debug for SingletonEntity<S> {
23  fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
24      self.0.fmt(f)
25  }
26}
27impl<S: Singleton> Debug for SingletonEntityUpdate<S> {
28  fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
29      self.0.fmt(f)
30  }
31}
32impl<S: Singleton> PartialEq for SingletonEntity<S> {
33  fn eq(&self, _: &Self) -> bool {
34      true
35  }
36}
37impl<S: Singleton> Eq for SingletonEntity<S> {}
38impl<S: Singleton> Serialize for SingletonEntity<S> {
39  fn serialize<SE>(&self, serializer: SE) -> Result<SE::Ok, SE::Error>
40      where
41          SE: serde::Serializer {
42      self.0.serialize(serializer)
43  }
44}
45impl<S: Singleton> Serialize for SingletonEntityUpdate<S> {
46  fn serialize<SE>(&self, serializer: SE) -> Result<SE::Ok, SE::Error>
47      where
48          SE: serde::Serializer {
49      self.0.serialize(serializer)
50  }
51}
52impl<'de, S: Singleton> Deserialize<'de> for SingletonEntity<S> {
53  fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
54      where
55          D: serde::Deserializer<'de> {
56      let data = S::deserialize(deserializer)?;
57      Ok(SingletonEntity::new(data))
58  } 
59}
60impl<'de, S: Singleton> Deserialize<'de> for SingletonEntityUpdate<S> {
61  fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
62      where
63          D: serde::Deserializer<'de> {
64      let data = S::Update::deserialize(deserializer)?;
65      Ok(SingletonEntityUpdate(data))
66  }
67}
68impl<S: Singleton> Updatable<SingletonEntityUpdate<S>> for SingletonEntity<S> {
69  fn update(&mut self, with: &SingletonEntityUpdate<S>) {
70      self.0.update(&with.0)
71  }
72}
73
74impl<S: Singleton> Entity for SingletonEntity<S> {
75  type ID = String;
76  type Update = SingletonEntityUpdate<S>;
77  const TYPE_NAME: &'static str = S::TYPE_NAME;
78  fn get_id(&self) -> &Self::ID {
79    &self.1
80  }
81}