use std::marker::PhantomData;
use yog_data::Schema;
pub struct EntityData<T> {
key: &'static str,
persist: bool,
value: PhantomData<fn() -> T>,
}
impl<T: Schema + Default> EntityData<T> {
pub const fn new(key: &'static str) -> Self {
EntityData {
key,
persist: true,
value: PhantomData,
}
}
pub const fn session(key: &'static str) -> Self {
EntityData {
key,
persist: false,
value: PhantomData,
}
}
pub fn with<R>(&self, uuid: &str, read: impl FnOnce(&T) -> R) -> R {
let key = self.entity_key();
let bytes =
crate::event::entity::data(uuid, &key).or_else(|| crate::body::entity_data(uuid, &key));
read(
&bytes
.and_then(|b| yog_data::read_bytes(&b).ok())
.unwrap_or_default(),
)
}
pub fn with_mut<R>(&self, uuid: &str, change: impl FnOnce(&mut T) -> R) -> R {
let key = self.entity_key();
let mut value: T = crate::event::entity::data(uuid, &key)
.and_then(|b| yog_data::read_bytes(&b).ok())
.unwrap_or_default();
let out = change(&mut value);
crate::event::entity::set_data(uuid, key, Some(&yog_data::to_bytes(&value)), self.persist);
out
}
fn entity_key(&self) -> String {
format!("{}{}{}", crate::mod_id(), yog_ids::sep::NAMESPACE, self.key)
}
}