Skip to main content

traaains/sim/signal/
commands.rs

1//! Commands for interfacing with signals
2
3use bevy::ecs::{entity::Entity, system::Command, world::World};
4
5use crate::sim::{
6    signal::SignalPos,
7    track::{pos::TrackPos, segment::signals_manager::SignalsManager},
8};
9
10/// Despawns the target signal along with removing it from the track segment it is attached to.
11pub struct RemoveSignal {
12    target: Entity,
13}
14
15impl RemoveSignal {
16    pub fn new(target: Entity) -> Self {
17        Self { target }
18    }
19}
20
21impl Command for RemoveSignal {
22    type Out = ();
23
24    fn apply(self, world: &mut World) -> Self::Out {
25        let (signal_idx, signal_segment) = {
26            let track_pos = world.get::<TrackPos>(self.target).unwrap();
27            (track_pos.idx, track_pos.segment)
28        };
29
30        let mut signals_manager = world.get_mut::<SignalsManager>(signal_segment).unwrap();
31        signals_manager.inner.remove(&SignalPos(signal_idx));
32
33        // finally, despawn the signal
34        world.despawn(self.target);
35    }
36}