gosh_dl/protocol/
scheduler.rs1use chrono::Weekday;
6use serde::{Deserialize, Serialize};
7
8#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
10pub struct ScheduleRule {
11 pub start_hour: u8,
13 pub end_hour: u8,
15 #[serde(default)]
17 pub days: Vec<Weekday>,
18 pub download_limit: Option<u64>,
20 pub upload_limit: Option<u64>,
22}
23
24impl ScheduleRule {
25 pub fn new(
27 start_hour: u8,
28 end_hour: u8,
29 days: Vec<Weekday>,
30 download_limit: Option<u64>,
31 upload_limit: Option<u64>,
32 ) -> Self {
33 Self {
34 start_hour: start_hour.min(23),
35 end_hour: end_hour.min(23),
36 days,
37 download_limit,
38 upload_limit,
39 }
40 }
41
42 pub fn all_days(
44 start_hour: u8,
45 end_hour: u8,
46 download_limit: Option<u64>,
47 upload_limit: Option<u64>,
48 ) -> Self {
49 Self::new(
50 start_hour,
51 end_hour,
52 Vec::new(),
53 download_limit,
54 upload_limit,
55 )
56 }
57
58 pub fn weekdays(
60 start_hour: u8,
61 end_hour: u8,
62 download_limit: Option<u64>,
63 upload_limit: Option<u64>,
64 ) -> Self {
65 Self::new(
66 start_hour,
67 end_hour,
68 vec![
69 Weekday::Mon,
70 Weekday::Tue,
71 Weekday::Wed,
72 Weekday::Thu,
73 Weekday::Fri,
74 ],
75 download_limit,
76 upload_limit,
77 )
78 }
79
80 pub fn weekends(
82 start_hour: u8,
83 end_hour: u8,
84 download_limit: Option<u64>,
85 upload_limit: Option<u64>,
86 ) -> Self {
87 Self::new(
88 start_hour,
89 end_hour,
90 vec![Weekday::Sat, Weekday::Sun],
91 download_limit,
92 upload_limit,
93 )
94 }
95
96 pub fn matches(&self, hour: u8, weekday: Weekday) -> bool {
98 if !self.days.is_empty() && !self.days.contains(&weekday) {
100 return false;
101 }
102
103 if self.start_hour <= self.end_hour {
105 hour >= self.start_hour && hour <= self.end_hour
107 } else {
108 hour >= self.start_hour || hour <= self.end_hour
110 }
111 }
112}
113
114#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
116pub struct BandwidthLimits {
117 pub download: Option<u64>,
119 pub upload: Option<u64>,
121}