use std::any::Any;
use crate::prelude::*;
#[derive(Debug, Default)]
pub struct World {
resources: Resources,
entities: Entities,
}
impl World {
pub fn new() -> Self {
Self::default()
}
pub fn run_system<'a, F, T: 'a>(&'a self, gen: F)
where
F: IntoSystem<'a, T>
{
gen.run(&self.entities, &self.resources)
}
pub fn insert_resource<T: std::any::Any>(&mut self, res: T) {
self.resources.add(res);
}
pub fn get_resource<T: Any>(&self) -> eyre::Result<Ref<T>> {
self.resources.get_ref()
}
pub fn get_resource_mut<T: Any>(&self) -> eyre::Result<RefMut<T>> {
self.resources.get_mut::<T>()
}
pub fn delete_resource<T: Any>(&mut self) -> eyre::Result<T> {
self.resources.delete::<T>()
}
}
impl World {
pub fn register_component<T: Any>(&mut self) {
self.entities.register_component::<T>()
}
pub fn spawn(&mut self) -> &mut Entities {
self.entities.create_entity()
}
pub fn delete_component_from_ent<T: Any>(&mut self, index: usize) {
self.entities.delete_component_by_entity_id::<T>(index)
}
pub fn delete_component_from_ent_checked<T: Any>(&mut self, index: usize) -> eyre::Result<()> {
self.entities.delete_component_by_entity_id_checked::<T>(index)
}
pub fn insert_component_into_entity<T: Any>(&mut self, data: T, index: usize) {
self.entities.insert_component_into_entity_by_id(data, index);
}
pub fn insert_component_into_entity_checked<T: Any>(&mut self, data: T, index: usize) -> eyre::Result<()> {
self.entities.insert_component_into_entity_by_id_checked(data, index)
}
pub fn unregister_component<T: Any>(&mut self) {
self.entities.delete_component::<T>();
}
pub fn unregister_component_checked<T: Any>(&mut self) -> eyre::Result<()> {
self.entities.delete_component_checked::<T>()
}
pub fn delete_entity(&mut self, index: usize) -> eyre::Result<()> {
self.entities.delete_entity_by_id(index)
}
}
impl World {
pub fn query(&self) -> Query {
Query::new(&self.entities)
}
}
impl std::fmt::Display for World {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{:#?}", self)
}
}