deepstrike_core/signals/
attention.rs1use crate::types::policy::{AttentionPolicy, SignalDisposition};
2use crate::types::signal::{RuntimeSignal, Urgency};
3
4pub 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}