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 "months" => Duration::from_days(count * 30),
21 "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}