Skip to main content

now/
now.rs

1use date_utilities::{Duration, FORMATS, Instant};
2use std::borrow::Cow;
3
4fn main() {
5    let mut args = std::env::args().skip(1);
6    // let format = arg.as_deref().unwrap_or_default();
7
8    let mut format = Cow::Borrowed(FORMATS::FULL_MINIMAL);
9    let mut now = Instant::now_local();
10
11    while let Some(arg) = args.next() {
12        match arg.as_str() {
13            "--help" => {
14                println!("now *format*");
15                println!("in date-utilities");
16                println!("by kaleidawave");
17                return;
18            }
19            "--format" => {
20                let next = args.next().unwrap();
21                format = match next.as_str() {
22                    "FULL_MINIMAL" => Cow::Borrowed(FORMATS::FULL_MINIMAL),
23                    "DATE_MONTH_YEAR" => Cow::Borrowed(FORMATS::DATE_MONTH_YEAR),
24                    "MONTH_DATE_YEAR" => Cow::Borrowed(FORMATS::MONTH_DATE_YEAR),
25                    "DATE_NAME_MONTH_YEAR" => Cow::Borrowed(FORMATS::DATE_NAME_MONTH_YEAR),
26                    "TIME_DATE_NAME_MONTH_YEAR" => {
27                        Cow::Borrowed(FORMATS::TIME_DATE_NAME_MONTH_YEAR)
28                    }
29                    "TIME" => Cow::Borrowed(FORMATS::TIME),
30                    "WEEK" => Cow::Borrowed(FORMATS::WEEK),
31                    "TIME_WITH_SECONDS" => Cow::Borrowed(FORMATS::TIME_WITH_SECONDS),
32                    _ => Cow::Owned(next),
33                };
34            }
35            "--add" => {
36                let next = args.next().unwrap();
37                let duration = duration_from_string(&next);
38                now += duration;
39            }
40            "--sub" => {
41                let next = args.next().unwrap();
42                let duration = duration_from_string(&next);
43                now -= duration;
44            }
45            arg => {
46                panic!("unknown {arg:?}");
47            }
48        }
49    }
50
51    let formatted = now.format(&format);
52
53    {
54        use std::io::{self, IsTerminal, Write};
55        let mut stdout = io::stdout().lock();
56        if stdout.is_terminal() {
57            writeln!(&mut stdout, "{formatted}").unwrap();
58        } else {
59            write!(&mut stdout, "{formatted}").unwrap();
60        }
61    }
62}
63
64fn duration_from_string(on: &str) -> Duration {
65    fn non_alphabetic(c: char) -> bool {
66        !c.is_alphabetic()
67    }
68
69    let (left, right) = on.rsplit_once(non_alphabetic).unwrap();
70
71    let left: u64 = str::parse(left).unwrap();
72    match right {
73        "day" | "days" => Duration::from_days(left),
74        "week" | "weeks" => Duration::from_days(left * 7),
75        time => panic!("unknown duration {time}"),
76    }
77}