sge 1.0.2

Simple game engine
Documentation
use std::{
    any::{Any, TypeId},
    collections::HashMap,
};

pub struct UserStorage(HashMap<TypeId, Box<dyn Any>>);

sge_global::global!(UserStorage, user_storage);

pub fn init() {
    set_user_storage(UserStorage::new());
    log::info!("Initialized user storage");
}

impl UserStorage {
    pub fn new() -> Self {
        Self(HashMap::new())
    }

    pub fn store<T: Any>(&mut self, data: T) {
        self.0.insert(data.type_id(), Box::new(data));
    }

    pub fn try_get<T: Any>(&mut self) -> Option<&T> {
        self.0
            .get(&TypeId::of::<T>())
            .and_then(|data| data.downcast_ref::<T>())
    }

    pub fn try_get_mut<T: Any>(&mut self) -> Option<&mut T> {
        self.0
            .get_mut(&TypeId::of::<T>())
            .and_then(|data| data.downcast_mut::<T>())
    }

    pub fn get<T: Any>(&mut self) -> &T {
        self.try_get().unwrap()
    }

    pub fn get_mut<T: Any>(&mut self) -> &mut T {
        self.try_get_mut().unwrap()
    }
}