tinyecs 0.0.3

Tiny entity component system
Documentation
use std::rc::Rc;
use std::cell::RefCell;

#[macro_use] extern crate tinyecs;

use tinyecs::*;

pub struct GlutinFacade;
impl GlutinFacade {
    pub fn new() -> GlutinFacade {
        GlutinFacade
    }
    pub fn draw_something(&mut self, some : &str) {
        println!("{}", some);
    }
}
pub struct HeavyGuiData;
impl Component for HeavyGuiData {}
impl HeavyGuiData {
    pub fn new(_ : &GlutinFacade) -> HeavyGuiData {
        HeavyGuiData
    }
}

transit_system!(Glutin2HeavySystem: RenderData => HeavyGuiData,
    |render_data| { HeavyGuiData::new(&render_data.facade.borrow_mut() ) });

pub struct Renderable;
impl Component for Renderable {}

pub struct GuiWindow;
impl Component for GuiWindow {}

pub struct RenderData {
    facade : Rc<RefCell<GlutinFacade>>
}
impl Component for RenderData {}


pub struct RenderSystem {
    facade : Rc<RefCell<GlutinFacade>>
}
impl RenderSystem {
    pub fn new() -> RenderSystem {
        RenderSystem {
            facade : Rc::new(RefCell::new(GlutinFacade::new()))
        }
    }
}

impl System for RenderSystem {
    fn aspect(&self) -> Aspect {
        aspect_all!(Renderable)
    }
    fn on_created(&mut self, entity_manager : &mut EntityManager) {
        let data_entity = entity_manager.create_entity();
        data_entity.add_component(RenderData {facade : self.facade.clone()});
    }
    fn process_one(&mut self, _ : &mut Entity) {
        self.facade.borrow_mut().draw_something("triangles triangles");
    }
}

pub struct GuiSystem;

impl System for GuiSystem {
    fn aspect(&self) -> Aspect {
        aspect_all!(GuiWindow)
    }
    fn data_aspects(&self) -> Vec<Aspect> {
        vec![aspect_all!(RenderData, HeavyGuiData)]
    }

    fn process_d(&mut self, _ : &mut Entity, data : &mut DataList) {
        let render_data = data.unwrap_entity().get_component::<RenderData>();
        let _gui_data   = data.unwrap_entity().get_component::<HeavyGuiData>();
        render_data.facade.borrow_mut().draw_something("gui gui gui");
    }
}

fn main() {
    let mut world = World::new();
    world.set_system(RenderSystem::new());
    world.set_system(GuiSystem);
    world.set_system(Glutin2HeavySystem);

    {
        let mut entity_manager = world.entity_manager();

        {
            let mesh = entity_manager.create_entity();

            mesh.add_component(Renderable);
            mesh.refresh();
        }
        {
            let window = entity_manager.create_entity();

            window.add_component(GuiWindow);
            window.refresh();
        }
    }
    world.update();
    world.update();
    world.update();
}