1use chrono::{DateTime, FixedOffset};
2
3use std::vec::IntoIter;
4
5use crate::utils;
6
7#[derive(Debug)]
8pub struct DateRange(pub DateTime<FixedOffset>, pub DateTime<FixedOffset>);
9
10#[derive(Debug)]
13pub struct Times {
14 session_times: IntoIter<DateRange>,
15}
16
17impl Times {
18 pub fn new(content: &str, date_range: &Option<DateRange>) -> Times {
19 let lines: Vec<&str> = content.trim().split('\n').collect();
20 let mut dates = lines
21 .iter()
22 .map(|line| {
23 let v = line.split(',').take(2).collect::<Vec<&str>>();
24 DateRange(
25 utils::datetime_from_str(v[0]),
26 utils::datetime_from_str(v[1]),
27 )
28 })
29 .collect::<Vec<_>>();
30
31 if let Some(DateRange(start, end)) = date_range {
32 let start_ms = start.timestamp();
33 let end_ms = end.timestamp();
34
35 dates.retain(|DateRange(session_start, _)| {
36 let ms = session_start.timestamp();
37 ms >= start_ms && ms <= end_ms
38 });
39 }
40
41 Times {
42 session_times: dates.into_iter(),
43 }
44 }
45}
46
47impl Iterator for Times {
48 type Item = DateRange;
49
50 fn next(&mut self) -> Option<Self::Item> {
51 self.session_times.next()
52 }
53}
54
55#[cfg(test)]
56mod test {
57 use super::*;
58
59 #[test]
60 fn different_timezones() {
61 let content = String::from(
64 "2021-12-10T09:59:28-05:00,2021-12-10T10:36:14.153827-05:00
652021-12-10T11:16:09-05:00,2021-12-10T12:49:13.180945-05:00
662021-12-11T01:01:09+00:00,2021-12-11T02:00:13.180945+00:00",
67 );
68
69 let range: Option<DateRange> = Some(DateRange(
70 utils::datetime_from_str("2021-12-10T00:00:00-05:00"),
71 utils::datetime_from_str("2021-12-10T23:59:59-05:00"),
72 ));
73
74 let times = Times::new(&content, &range);
75
76 assert_eq!(times.session_times.len(), 3);
77 }
78
79 #[test]
80 fn different_timezones_2() {
81 let content = String::from(
84 "2021-12-10T09:59:28-05:00,2021-12-10T10:36:14.153827-05:00
852021-12-10T11:16:09-05:00,2021-12-10T12:49:13.180945-05:00
862021-12-10T01:01:09+00:00,2021-12-10T02:00:13.180945+00:00",
87 );
88
89 let range: Option<DateRange> = Some(DateRange(
90 utils::datetime_from_str("2021-12-10T00:00:00-05:00"),
91 utils::datetime_from_str("2021-12-10T23:59:59-05:00"),
92 ));
93
94 let times = Times::new(&content, &range);
95
96 assert_eq!(times.session_times.len(), 2);
97 }
98}