autopulse_service/settings/
timer.rs1use serde::{Deserialize, Serialize};
2use std::collections::HashMap;
3
4#[derive(Serialize, Deserialize, Clone, Default)]
5pub struct Timer {
6 pub wait: Option<u64>,
8}
9
10impl Timer {
11 pub fn chain(&self, link: &Self) -> Self {
12 Self {
13 wait: self
14 .wait
15 .or(link.wait)
16 .map(|wait| wait + link.wait.unwrap_or(0)),
17 }
18 }
19}
20
21#[derive(Serialize, Clone, Default)]
62pub struct EventTimers {
63 timers: HashMap<String, Timer>,
64}
65
66impl EventTimers {
67 pub fn get(&self, event_name: &str) -> Option<&Timer> {
68 self.timers.get(event_name.to_lowercase().as_str())
69 }
70}
71
72impl<'de> Deserialize<'de> for EventTimers {
73 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
74 where
75 D: serde::Deserializer<'de>,
76 {
77 let map: HashMap<String, Timer> = HashMap::deserialize(deserializer)?;
78
79 Ok(Self {
80 timers: map
81 .into_iter()
82 .map(|(k, v)| (k.to_lowercase(), v))
83 .collect(),
84 })
85 }
86}
87
88#[cfg(test)]
89mod tests {
90 use super::*;
91
92 #[test]
93 fn test_timer_chain() {
94 let timer1 = Timer { wait: Some(10) };
95 let timer2 = Timer { wait: Some(5) };
96 let chained_timer = timer1.chain(&timer2);
97
98 assert_eq!(chained_timer.wait, Some(15));
99 }
100
101 #[test]
102 fn test_event_timers_get() {
103 let mut event_timers = EventTimers {
104 timers: HashMap::new(),
105 };
106
107 event_timers
108 .timers
109 .insert("download".to_string(), Timer { wait: Some(10) });
110
111 assert_eq!(event_timers.get("download").unwrap().wait, Some(10));
112 assert!(event_timers.get("unknown").is_none());
113 }
114}