use std::any::Any;
use std::collections::HashMap;
use serde::Serialize;
use serde::de::DeserializeOwned;
use slotmap::SecondaryMap;
use crate::entity::EntityId;
pub trait AnyExtMap: Send + Sync {
fn remove(&mut self, id: EntityId);
fn as_any(&self) -> &dyn Any;
fn as_any_mut(&mut self) -> &mut dyn Any;
fn serialize_entries(&self) -> HashMap<EntityId, String>;
fn deserialize_entries(&mut self, data: &HashMap<EntityId, String>);
}
impl<T: 'static + Send + Sync + Serialize + DeserializeOwned> AnyExtMap
for SecondaryMap<EntityId, T>
{
fn remove(&mut self, id: EntityId) {
self.remove(id);
}
fn as_any(&self) -> &dyn Any {
self
}
fn as_any_mut(&mut self) -> &mut dyn Any {
self
}
fn serialize_entries(&self) -> HashMap<EntityId, String> {
self.iter()
.filter_map(|(id, val)| ron::to_string(val).ok().map(|s| (id, s)))
.collect()
}
fn deserialize_entries(&mut self, data: &HashMap<EntityId, String>) {
for (id, ron_str) in data {
if let Ok(val) = ron::from_str::<T>(ron_str) {
self.insert(*id, val);
}
}
}
}