use crate::apogee_core_v1::{ apogee_condition_v1, apogee_manager_v1, apogee_reload_v1, apogee_service_v1, apogee_task_v1, }; use bevy_ecs::prelude::*; use bevy_ecs::schedule::ScheduleLabel; use std::collections::{BTreeMap, HashMap}; use std::sync; #[derive(ScheduleLabel, Clone, Debug, PartialEq, Eq, Hash)] pub struct Reconcile; #[derive(Resource, Default)] pub struct TaskRegistry { pub by_name: BTreeMap, Entity>, pub by_object: HashMap, } #[derive(Resource, Default)] pub struct ServiceRegistry { pub by_name: BTreeMap, Entity>, pub by_object: HashMap, } #[derive(Resource, Default)] pub struct ConditionRegistry { pub by_name: BTreeMap, Entity>, pub by_object: HashMap, } #[derive(Resource, Default)] pub struct Managers(pub Vec); impl Managers { pub fn service_added(&self, name: &str) { for manager in self .0 .iter() .filter(|manager| manager.try_client().is_some()) { manager.send_service_added(name); } } pub fn service_removed(&self, name: &str) { for manager in self .0 .iter() .filter(|manager| manager.try_client().is_some()) { manager.send_service_removed(name); } } pub fn task_added(&self, name: &str) { for manager in self .0 .iter() .filter(|manager| manager.try_client().is_some()) { manager.send_task_added(name); } } pub fn task_removed(&self, name: &str) { for manager in self .0 .iter() .filter(|manager| manager.try_client().is_some()) { manager.send_task_removed(name); } } pub fn condition_added(&self, name: &str) { for manager in self .0 .iter() .filter(|manager| manager.try_client().is_some()) { manager.send_condition_added(name); } } } #[derive(Event)] pub struct ReloadRequested(pub Option); #[derive(Resource, Clone)] pub struct LoopSignal(pub calloop::LoopSignal); #[derive(Event)] pub struct RestartRequested(pub Entity); pub struct LoopHandle(pub calloop::LoopHandle<'static, crate::Apogee>);