Skip to main content

fantasy_craft/core/
context.rs

1use 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    /// Inserts a new resource.
27    pub fn insert_resource<T: Any + Send + 'static>(&mut self, resource: T) {
28        self.resources.insert(resource);
29    }
30
31    /// Gets an immutable reference to a resource.
32    /// Panics if the resource is not found.
33    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    /// Gets a mutable reference to a resource.
39    /// Panics if the resource is not found.
40    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    /// Tries to get an immutable reference to a resource.
46    /// This is the method you asked for.
47    pub fn get_resource<T: Any + 'static>(&self) -> Option<&T> {
48        self.resources.get::<T>()
49    }
50
51    /// Tries to get a mutable reference to a resource.
52    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}