ecs-lib-rs 0.1.1

An Entity Component System (ECS) Framework for learning.
Documentation
use std::ops::{Deref, DerefMut};

#[cfg(test)]
mod tests {
    use crate::FpsResource;
    use ecs_lib_rs::World;
    use std::any::Any;

    #[test]
    fn create_and_get_resources_immutably() {
        let mut world = World::new();
        let fps = world.get_resource::<FpsResource>();
        assert_eq!(fps, None);
        world.add_resource(FpsResource(60));
        let fps = world.get_resource::<FpsResource>();
        assert_eq!(fps, Some(&FpsResource(60)));
    }

    #[test]
    fn get_resources_mutably() {
        let mut world = World::new();
        let fps = world.get_resource_mut::<FpsResource>();
        assert_eq!(fps, None);
        world.add_resource(FpsResource(60));
        {
            let fps = world.get_resource_mut::<FpsResource>();
            assert_eq!(fps, Some(&mut FpsResource(60)));
            let fps = fps.unwrap();
            (*fps).0 += 1;
        }
        let fps = world.get_resource::<FpsResource>();
        assert_eq!(fps, Some(&FpsResource(61)));
    }

    #[test]
    fn delete_resource() {
        let mut world = World::new();
        assert_eq!(
            world.remove_resource::<FpsResource>().type_id(),
            (None as Option<Box<dyn Any>>).type_id()
        );
        world.add_resource(FpsResource(60));
        assert_eq!(
            world.remove_resource::<FpsResource>().map(|o| o.type_id()),
            Some((Box::new(FpsResource(60)) as Box<dyn Any>).type_id())
        );
    }
}

#[derive(Debug, PartialEq, Eq)]
struct FpsResource(u32);

impl Deref for FpsResource {
    type Target = u32;

    fn deref(&self) -> &Self::Target {
        &self.0
    }
}

impl DerefMut for FpsResource {
    fn deref_mut(&mut self) -> &mut Self::Target {
        &mut self.0
    }
}