live_entity/
singleton_entity.rs1use 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}