concinnity_core/ecs/
built_system.rs1use alloc::boxed::Box;
9
10use crate::ecs::{Access, PipelineContext, StepResult, System};
11
12#[derive(Debug)]
14pub struct BuiltSystem {
15 name: &'static str,
16 system: Box<dyn System>,
17}
18
19impl BuiltSystem {
20 pub(crate) fn new(name: &'static str, system: Box<dyn System>) -> Self {
22 Self { name, system }
23 }
24
25 pub fn name(&self) -> &'static str {
28 self.name
29 }
30
31 pub fn init(&mut self, ctx: &mut PipelineContext) {
33 self.system.init(ctx);
34 }
35
36 pub fn step(&mut self, ctx: &mut PipelineContext) -> StepResult {
38 self.system.step(ctx)
39 }
40
41 pub fn access(&self) -> Access {
44 self.system.access()
45 }
46
47 pub fn downcast_ref<S: System>(&self) -> Option<&S> {
49 (&*self.system as &dyn core::any::Any).downcast_ref::<S>()
50 }
51
52 pub fn downcast_mut<S: System>(&mut self) -> Option<&mut S> {
57 (&mut *self.system as &mut dyn core::any::Any).downcast_mut::<S>()
58 }
59}
60
61#[cfg(test)]
62mod tests {
63 use super::*;
64
65 #[derive(Debug)]
66 struct Tick(u32);
67
68 impl System for Tick {
69 fn step(&mut self, _ctx: &mut PipelineContext) -> StepResult {
70 self.0 += 1;
71 StepResult::Continue
72 }
73 }
74
75 #[derive(Debug)]
76 struct Other;
77
78 impl System for Other {
79 fn step(&mut self, _ctx: &mut PipelineContext) -> StepResult {
80 StepResult::Continue
81 }
82 }
83
84 #[test]
86 fn keeps_the_table_name() {
87 let built = BuiltSystem::new("Tick", Box::new(Tick(0)));
88 assert_eq!(built.name(), "Tick");
89 }
90
91 #[test]
93 fn steps_the_boxed_system() {
94 let mut world = crate::ecs::World::new();
95 let mut ctx = world.context();
96 let mut built = BuiltSystem::new("Tick", Box::new(Tick(0)));
97 assert_eq!(built.step(&mut ctx), StepResult::Continue);
98 assert_eq!(built.step(&mut ctx), StepResult::Continue);
99 assert_eq!(built.downcast_ref::<Tick>().expect("a Tick").0, 2);
100 }
101
102 #[test]
104 fn downcast_answers_only_for_its_own_type() {
105 let mut built = BuiltSystem::new("Tick", Box::new(Tick(7)));
106 assert!(built.downcast_ref::<Other>().is_none());
107 assert!(built.downcast_mut::<Other>().is_none());
108 built.downcast_mut::<Tick>().expect("a Tick").0 = 9;
109 assert_eq!(built.downcast_ref::<Tick>().expect("a Tick").0, 9);
110 }
111}