Skip to main content

deepstrike_core/signals/
attention.rs

1use crate::types::policy::{AttentionPolicy, SignalDisposition};
2use crate::types::signal::{RuntimeSignal, Urgency};
3
4/// Default attention policy based on signal urgency.
5pub struct UrgencyBasedPolicy;
6
7impl AttentionPolicy for UrgencyBasedPolicy {
8    fn evaluate(&self, signal: &RuntimeSignal, is_running: bool) -> SignalDisposition {
9        match signal.urgency {
10            Urgency::Critical => {
11                if is_running {
12                    SignalDisposition::InterruptNow
13                } else {
14                    SignalDisposition::Run { priority: 255 }
15                }
16            }
17            Urgency::High => {
18                if is_running {
19                    SignalDisposition::Interrupt
20                } else {
21                    SignalDisposition::Run { priority: 100 }
22                }
23            }
24            Urgency::Normal => SignalDisposition::Queue,
25            Urgency::Low => SignalDisposition::Observe,
26        }
27    }
28}
29
30#[cfg(test)]
31mod tests {
32    use super::*;
33    use crate::types::signal::{SignalSource, SignalType};
34
35    #[test]
36    fn critical_signal_interrupts_running() {
37        let policy = UrgencyBasedPolicy;
38        let signal = RuntimeSignal::new(
39            SignalSource::Gateway,
40            SignalType::Alert,
41            Urgency::Critical,
42            "fire",
43        );
44        assert_eq!(
45            policy.evaluate(&signal, true),
46            SignalDisposition::InterruptNow
47        );
48    }
49
50    #[test]
51    fn low_signal_observed() {
52        let policy = UrgencyBasedPolicy;
53        let signal =
54            RuntimeSignal::new(SignalSource::Cron, SignalType::Event, Urgency::Low, "tick");
55        assert_eq!(policy.evaluate(&signal, false), SignalDisposition::Observe);
56    }
57}