dev_kit/command/time/
timestring_guess.rs

1use super::Timestring;
2use std::convert::TryFrom;
3
4impl TryFrom<&Timestring> for chrono::DateTime<chrono::Utc> {
5    type Error = anyhow::Error;
6
7    fn try_from(Timestring(val): &Timestring) -> Result<Self, Self::Error> {
8        parse_from_rfc3339(val)
9            .or_else(|| parse_from_rfc2822(val))
10            .or_else(|| guess_from_known_formats(val))
11            .ok_or_else(|| anyhow::anyhow!("Invalid time string: {}", val))
12    }
13}
14
15fn parse_from_rfc3339(val: &str) -> Option<chrono::DateTime<chrono::Utc>> {
16    match chrono::DateTime::parse_from_rfc3339(val) {
17        Ok(val) => Some(val.to_utc()),
18        Err(err) => {
19            log::debug!("parse time {val} by rfc3339 failed, err: {err:?}");
20            None
21        }
22    }
23}
24
25fn parse_from_rfc2822(val: &str) -> Option<chrono::DateTime<chrono::Utc>> {
26    match chrono::DateTime::parse_from_rfc2822(val) {
27        Ok(val) => Some(val.to_utc()),
28        Err(err) => {
29            log::debug!("parse time {val} by rfc2822 failed, err: {err:?}");
30            None
31        }
32    }
33}
34
35fn guess_from_known_formats(val: &str) -> Option<chrono::DateTime<chrono::Utc>> {
36    match dateparser::parse(val) {
37        Ok(utc_dt) => {
38            Some(utc_dt)
39        }
40        Err(err) => {
41            log::debug!("guess time {val} failed, err: {err:?}");
42            None
43        }
44    }
45}