tempus_cli/
times.rs

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/// stores time content of the
11/// TEMPUS_LOG file
12#[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        // top two are in est, bottom is utc
62        // they should all be considered the same day
63        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        // top two are in est, bottom is utc
82        // they should all be considered the same day
83        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}