autopulse_service/settings/
timer.rs

1use serde::{Deserialize, Serialize};
2use std::collections::HashMap;
3
4#[derive(Serialize, Deserialize, Clone, Default)]
5pub struct Timer {
6    /// Time to wait before processing
7    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/// Event timers
22///
23/// Define timers that apply to only specific events
24///
25/// Note: Keys are case insensitive
26///
27/// -rr events:
28/// - `Download` - when a download is completed
29/// - `Rename` - when a file is renamed
30///
31/// Lidarr:
32/// - `ArtistDelete` - when an artist is deleted
33///
34/// Radarr:
35/// - `MovieDelete` - when a movie is deleted
36/// - `MovieFileDelete` - when a movie file is deleted
37///
38/// Readarr:
39/// - `AuthorDelete` - when an author is deleted
40/// - `BookDelete` - when a book is deleted
41/// - `BookFileDelete` - when a book file is deleted
42///
43/// Sonarr:
44/// - `SeriesDelete` - when a series is deleted
45/// - `EpisodeFileDelete` - when an episode file is deleted
46///
47/// **Note: These timers apply on top of the original timer**
48///
49/// Example:
50/// ```yaml
51/// event_timers:
52///   download:
53///     wait: 10
54///   
55///   seriesdelete:
56///     wait: 5
57///
58///   EpisodeFileDelete:
59///     wait: 2
60/// ```
61#[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}