1use date_utilities::{Duration, FORMATS, Instant};
2use std::borrow::Cow;
3
4fn main() {
5 let mut args = std::env::args().skip(1);
6 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}