fantasy_craft/core/
context.rs1use std::any::Any;
2
3use hecs::World;
4
5use crate::{core::{resource::ResourceMap, time::DeltaTime}, prelude::{AssetServer, GameState}};
6
7pub struct Context {
8 pub world: World,
9 pub asset_server: AssetServer,
10 pub game_state: GameState,
11 pub resources: ResourceMap
12}
13
14impl Context {
15 pub fn new(world: World, asset_server: AssetServer) -> Self {
16 let resources = ResourceMap::new();
17
18 Self {
19 world,
20 asset_server,
21 game_state: GameState::Playing,
22 resources
23 }
24 }
25
26 pub fn insert_resource<T: Any + Send + 'static>(&mut self, resource: T) {
28 self.resources.insert(resource);
29 }
30
31 pub fn resource<T: Any + 'static>(&self) -> &T {
34 self.get_resource::<T>()
35 .unwrap_or_else(|| panic!("Resource not found: {}", std::any::type_name::<T>()))
36 }
37
38 pub fn resource_mut<T: Any + Send + 'static>(&mut self) -> &mut T {
41 self.get_resource_mut::<T>()
42 .unwrap_or_else(|| panic!("Resource not found: {}", std::any::type_name::<T>()))
43 }
44
45 pub fn get_resource<T: Any + 'static>(&self) -> Option<&T> {
48 self.resources.get::<T>()
49 }
50
51 pub fn get_resource_mut<T: Any + Send + 'static>(&mut self) -> Option<&mut T> {
53 self.resources.get_mut::<T>()
54 }
55
56 pub fn dt(&self) -> f32 {
57 self.resource::<DeltaTime>().0
58 }
59}