Skip to main content

mittens_engine/engine/ecs/component/
signal_observer_router.rs

1use crate::engine::ecs::component::Component;
2use crate::engine::ecs::component::ce_helpers::*;
3use crate::engine::ecs::{ComponentId, SignalEmitter};
4
5/// Signal routing operator: filters signal observers (handlers) on this node.
6#[derive(Debug, Clone, Default)]
7pub struct SignalObserverRouterComponent {
8    /// Names of handlers that are forbidden from receiving signals on this node.
9    pub blacklist: Vec<String>,
10
11    /// (Optional) If non-empty, only allow handlers present in this list.
12    pub whitelist: Vec<String>,
13}
14
15impl SignalObserverRouterComponent {
16    pub fn new() -> Self {
17        Self::default()
18    }
19
20    pub fn with_blacklist(mut self, blacklist: Vec<String>) -> Self {
21        self.blacklist = blacklist;
22        self
23    }
24
25    pub fn with_whitelist(mut self, whitelist: Vec<String>) -> Self {
26        self.whitelist = whitelist;
27        self
28    }
29}
30
31impl Component for SignalObserverRouterComponent {
32    fn name(&self) -> &'static str {
33        "signal_observer_router"
34    }
35
36    fn as_any(&self) -> &dyn std::any::Any {
37        self
38    }
39
40    fn as_any_mut(&mut self) -> &mut dyn std::any::Any {
41        self
42    }
43
44    fn init(&mut self, _emit: &mut dyn SignalEmitter, _component: ComponentId) {}
45
46    fn to_mms_ast(
47        &self,
48        _world: &crate::engine::ecs::World,
49    ) -> crate::scripting::ast::ComponentExpression {
50        let mut ce = ce("ObserverRouter");
51        if !self.blacklist.is_empty() {
52            ce = ce.with_call("blacklist", vec![ls(&self.blacklist)]);
53        }
54        if !self.whitelist.is_empty() {
55            ce = ce.with_call("whitelist", vec![ls(&self.whitelist)]);
56        }
57        ce
58    }
59}