acute_app 0.1.3

app sub-crate of acute
Documentation
use acute_ecs::prelude::*;
use super::app::App;
use acute_ecs::systems::resource::Resource;
use acute_core::Timer;
use acute_ecs::systems::schedule::Builder;
use acute_window::window::Window;
use acute_render_backend::Renderer;

pub struct AppBuilder {
    pub app: App,
    pub system_builder: Builder,
    pub render_system_builder: Builder,
    pub window: Option<Window>,
}

impl AppBuilder {
    pub fn build(mut self) -> App {
        let renderer = match self.window {
            Some(window) => {
                Some(futures::executor::block_on(Renderer::new(&mut self.app.resources, window)))
            }
            None => None
        };
        if let Some(renderer) = renderer {
            self.app.resources.insert(renderer);
        }

        self.app.schedule = self.system_builder.build();
        self.app.render_schedule = self.render_system_builder.build();

        self.app
    }
    
    pub fn with_window(mut self, window: Window) -> Self {
        self.window = Some(window);
        self
    }

    pub fn add_resource<T: Resource>(mut self, resource: T) -> Self {
        self.app.resources.insert(resource);
        self
    }

    pub fn add_system(mut self, system: Box<dyn Schedulable>) -> Self {
        self.system_builder = self.system_builder.add_system(system);
        self
    }

    pub fn add_render_system(mut self, render_system: Box<dyn Schedulable>) -> Self {
        self.render_system_builder = self.render_system_builder.add_system(render_system);
        self
    }
}



impl Default for AppBuilder {
    fn default() -> Self {
        Self {
            app: Default::default(),
            system_builder: Default::default(),
            render_system_builder: Default::default(),
            window: None
        }
    }
}