use std::any::Any;
use hecs::World;
use crate::{core::{resource::ResourceMap, time::DeltaTime}, prelude::{AssetServer, GameState}};
pub struct Context {
pub world: World,
pub asset_server: AssetServer,
pub game_state: GameState,
pub resources: ResourceMap
}
impl Context {
pub fn new(world: World, asset_server: AssetServer) -> Self {
let resources = ResourceMap::new();
Self {
world,
asset_server,
game_state: GameState::Playing,
resources
}
}
pub fn insert_resource<T: Any + Send + 'static>(&mut self, resource: T) {
self.resources.insert(resource);
}
pub fn resource<T: Any + 'static>(&self) -> &T {
self.get_resource::<T>()
.unwrap_or_else(|| panic!("Resource not found: {}", std::any::type_name::<T>()))
}
pub fn resource_mut<T: Any + Send + 'static>(&mut self) -> &mut T {
self.get_resource_mut::<T>()
.unwrap_or_else(|| panic!("Resource not found: {}", std::any::type_name::<T>()))
}
pub fn get_resource<T: Any + 'static>(&self) -> Option<&T> {
self.resources.get::<T>()
}
pub fn get_resource_mut<T: Any + Send + 'static>(&mut self) -> Option<&mut T> {
self.resources.get_mut::<T>()
}
pub fn dt(&self) -> f32 {
self.resource::<DeltaTime>().0
}
}