unen_app 0.0.3

Application crate for UnnamedEngine
Documentation
use std::{any::TypeId, collections::HashMap};

use crate::system::SystemContainer;

pub trait Stage: Send + Sync + 'static {
    fn name(&self) -> &'static str {
        std::any::type_name::<Self>()
    }
}

mod _app_stages {
    use super::Stage;

    pub struct AppStageStart;
    pub struct AppStageStep;
    pub struct AppStageStop;

    impl Stage for AppStageStart {}
    impl Stage for AppStageStep {}
    impl Stage for AppStageStop {}

    pub const START: AppStageStart = AppStageStart;
    pub const STEP: AppStageStep = AppStageStep;
    pub const STOP: AppStageStop = AppStageStop;
}

pub use _app_stages::{START, STEP, STOP};

#[derive(Default)]
pub struct StageContainer {
    container: HashMap<TypeId, SystemContainer>,
}

impl StageContainer {
    pub fn insert<S: Stage>(&mut self, _stage: S) {
        self.container.entry(TypeId::of::<S>()).or_default();
    }

    pub fn get<S: Stage>(&mut self, _stage: S) -> &mut SystemContainer {
        self.container.entry(TypeId::of::<S>()).or_default()
    }
}