Skip to main content

when/
when.rs

1use date_utilities::{Duration, FORMATS, Instant};
2
3fn main() {
4    let now = Instant::now_local();
5
6    let mut args = std::env::args().skip(1);
7
8    let next = args.next().unwrap();
9
10    if let Ok(count) = str::parse::<u64>(&next) {
11        let kind: String = args.next().expect("kind");
12
13        let duration: Duration = match kind.as_str() {
14            "seconds" => Duration::from_seconds(count),
15            "minutes" => Duration::from_minutes(count),
16            "hours" => Duration::from_hours(count),
17            "days" => Duration::from_days(count),
18            "weeks" => Duration::from_weeks(count),
19            // TODO
20            "months" => Duration::from_days(count * 30),
21            // TODO
22            "years" => Duration::from_days(count * 356),
23            kind => {
24                panic!("unknown {kind:?}");
25            }
26        };
27
28        let then: Instant = now - duration;
29
30        let after = args.next();
31        let after: &str = after.as_deref().unwrap_or_default();
32        let format = match after {
33            "git" => "%year-%month-%date %hour:%minute:%second",
34            "" => FORMATS::FULL_MINIMAL,
35            unknown => {
36                panic!("unknown {unknown:?}");
37            }
38        };
39
40        let formatted = then.format(format);
41        println!("{formatted}");
42    } else if let "is" | "was" = next.as_str() {
43        let then = Instant::parse_english(&mut args).unwrap();
44        if let Some(next) = args.next()
45            && next == "to"
46        {
47            let next = Instant::parse_english(&mut args).unwrap();
48            let value = match next.difference(then) {
49                Ok(future) => future,
50                Err(past) => past,
51            };
52            println!("{value}", value = value.format());
53        } else {
54            match then.difference(now) {
55                Ok(future) => {
56                    println!("in {future} time", future = future.format());
57                }
58                Err(past) => {
59                    println!("{past} ago", past = past.format());
60                }
61            }
62        }
63    } else {
64        panic!("unknown {next:?}. expected data or is / when");
65    }
66}