dev_kit/command/time/
timestring_guess.rs1use 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}