Skip to main content

pite_core/
signals.rs

1// SPDX-License-Identifier: MIT OR Apache-2.0
2use std::collections::HashMap;
3
4/// A signal is a name plus ordered payload type names, registered at
5/// class-load. `connect`/`emit` dispatch through the host; drop-disconnect
6/// is handled on node drop.
7#[derive(Debug, Clone, PartialEq)]
8pub struct SignalDef {
9    pub name: String,
10    pub payload: Vec<String>,
11}
12
13#[derive(Debug, Default)]
14pub struct SignalRegistry {
15    defs: HashMap<String, SignalDef>,
16}
17
18impl SignalRegistry {
19    pub fn new() -> Self {
20        Self::default()
21    }
22
23    pub fn register(&mut self, name: impl Into<String>, payload: Vec<String>) {
24        let name = name.into();
25        self.defs.insert(name.clone(), SignalDef { name, payload });
26    }
27
28    pub fn get(&self, name: &str) -> Option<&SignalDef> {
29        self.defs.get(name)
30    }
31
32    pub fn len(&self) -> usize {
33        self.defs.len()
34    }
35
36    pub fn is_empty(&self) -> bool {
37        self.defs.is_empty()
38    }
39}
40
41#[cfg(test)]
42mod tests {
43    use super::*;
44
45    #[test]
46    fn registry_records_name_and_payload() {
47        let mut registry = SignalRegistry::new();
48        registry.register("health_changed", vec!["int".to_string()]);
49        let def = registry.get("health_changed").unwrap();
50        assert_eq!(def.payload, vec!["int".to_string()]);
51    }
52}