sim_core/
hooks.rs

1use bevy::prelude::*;
2
3/// Hook trait for registering concrete controls in the app crate.
4pub trait ControlsHook: Send + Sync + 'static {
5    fn register(&self, app: &mut App);
6}
7
8/// Hook trait for registering concrete autopilot systems in the app crate.
9pub trait AutopilotHook: Send + Sync + 'static {
10    fn register(&self, app: &mut App);
11}
12
13/// Optional hooks the app can provide; left empty by default.
14#[derive(Default, bevy::prelude::Resource)]
15pub struct SimHooks {
16    pub controls: Option<Box<dyn ControlsHook>>,
17    pub autopilot: Option<Box<dyn AutopilotHook>>,
18}
19
20impl SimHooks {
21    pub fn apply(&self, app: &mut App) {
22        if let Some(h) = &self.controls {
23            h.register(app);
24        }
25        if let Some(h) = &self.autopilot {
26            h.register(app);
27        }
28    }
29}