From f231fee50874a406f0790ecc885699daae80aa64 Mon Sep 17 00:00:00 2001 From: Joscha Date: Mon, 2 May 2022 11:37:09 +0200 Subject: [PATCH 01/20] Document Done fields --- src/files/commands.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/files/commands.rs b/src/files/commands.rs index a53aa50..483fd7a 100644 --- a/src/files/commands.rs +++ b/src/files/commands.rs @@ -346,7 +346,9 @@ pub enum DoneKind { #[derive(Debug)] pub struct Done { pub kind: DoneKind, + /// The date of the task the DONE refers to. pub date: Option, + /// When the task was actually completed. pub done_at: NaiveDate, } From 74433eccbe6d3ec0a32256280931b42d400fce02 Mon Sep 17 00:00:00 2001 From: Joscha Date: Mon, 2 May 2022 11:49:57 +0200 Subject: [PATCH 02/20] Highlight current birthdays --- CHANGELOG.md | 3 +++ src/cli/layout/line.rs | 40 +++++++++++++++++++++++++--------------- src/cli/print.rs | 11 ++++++++++- src/cli/util.rs | 4 ++++ 4 files changed, 42 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 18b3029..2c219af 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## Unreleased +### Changed +- Birthdays for current day are now highlighted + ## 0.2.0 - 2022-03-18 ### Added diff --git a/src/cli/layout/line.rs b/src/cli/layout/line.rs index fffaab6..a63d45e 100644 --- a/src/cli/layout/line.rs +++ b/src/cli/layout/line.rs @@ -56,7 +56,7 @@ pub enum Times { FromTo(Time, Time), } -#[derive(Debug, Clone, Copy)] +#[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum LineKind { Task, Done, @@ -79,6 +79,7 @@ pub enum LineEntry { Entry { number: Option, spans: Vec>, + today: bool, time: Times, kind: LineKind, text: String, @@ -121,17 +122,18 @@ impl LineLayout { self.step_spans(); for day in layout.range.days() { + let today = day == layout.today; let spans = self.spans_for_line(); self.line(LineEntry::Day { spans, date: day, - today: day == layout.today, + today, has_log: files.log(day).is_some(), }); let layout_entries = layout.days.get(&day).expect("got nonexisting day"); for layout_entry in layout_entries { - self.render_layout_entry(entries, layout_entry); + self.render_layout_entry(entries, layout_entry, today); } } } @@ -157,11 +159,11 @@ impl LineLayout { .ok_or(Error::NoSuchEntry(number)) } - fn render_layout_entry(&mut self, entries: &[Entry], l_entry: &DayEntry) { + fn render_layout_entry(&mut self, entries: &[Entry], l_entry: &DayEntry, today: bool) { match l_entry { DayEntry::End(i) => { self.stop_span(*i); - self.line_entry(entries, *i, Times::Untimed, None); + self.line_entry(entries, *i, today, Times::Untimed, None); } DayEntry::Now(t) => self.line(LineEntry::Now { spans: self.spans_for_line(), @@ -169,17 +171,17 @@ impl LineLayout { }), DayEntry::TimedEnd(i, t) => { self.stop_span(*i); - self.line_entry(entries, *i, Times::At(*t), None); + self.line_entry(entries, *i, today, Times::At(*t), None); } DayEntry::TimedAt(i, t, t2) => { let time = t2 .map(|t2| Times::FromTo(*t, t2)) .unwrap_or_else(|| Times::At(*t)); - self.line_entry(entries, *i, time, None); + self.line_entry(entries, *i, today, time, None); } DayEntry::TimedStart(i, t) => { self.start_span(*i); - self.line_entry(entries, *i, Times::At(*t), None); + self.line_entry(entries, *i, today, Times::At(*t), None); } DayEntry::ReminderSince(i, d) => { let extra = if *d == 1 { @@ -187,22 +189,22 @@ impl LineLayout { } else { format!("{d} days ago") }; - self.line_entry(entries, *i, Times::Untimed, Some(extra)); + self.line_entry(entries, *i, today, Times::Untimed, Some(extra)); } DayEntry::At(i) => { - self.line_entry(entries, *i, Times::Untimed, None); + self.line_entry(entries, *i, today, Times::Untimed, None); } DayEntry::ReminderWhile(i, d) => { let plural = if *d == 1 { "" } else { "s" }; let extra = format!("{d} day{plural} left"); - self.line_entry(entries, *i, Times::Untimed, Some(extra)); + self.line_entry(entries, *i, today, Times::Untimed, Some(extra)); } DayEntry::Undated(i) => { - self.line_entry(entries, *i, Times::Untimed, None); + self.line_entry(entries, *i, today, Times::Untimed, None); } DayEntry::Start(i) => { self.start_span(*i); - self.line_entry(entries, *i, Times::Untimed, None); + self.line_entry(entries, *i, today, Times::Untimed, None); } DayEntry::ReminderUntil(i, d) => { let extra = if *d == 1 { @@ -210,7 +212,7 @@ impl LineLayout { } else { format!("in {d} days") }; - self.line_entry(entries, *i, Times::Untimed, Some(extra)); + self.line_entry(entries, *i, today, Times::Untimed, Some(extra)); } } } @@ -277,7 +279,14 @@ impl LineLayout { self.step_spans(); } - fn line_entry(&mut self, entries: &[Entry], index: usize, time: Times, extra: Option) { + fn line_entry( + &mut self, + entries: &[Entry], + index: usize, + today: bool, + time: Times, + extra: Option, + ) { let entry = &entries[index]; let number = match self.numbers.get(&index) { @@ -292,6 +301,7 @@ impl LineLayout { self.line(LineEntry::Entry { number: Some(number), spans: self.spans_for_line(), + today, time, kind: Self::entry_kind(entry), text: Self::entry_title(entry), diff --git a/src/cli/print.rs b/src/cli/print.rs index 1cb8caf..471cd85 100644 --- a/src/cli/print.rs +++ b/src/cli/print.rs @@ -35,12 +35,14 @@ impl ShowLines { LineEntry::Entry { number, spans, + today, time, kind, text, has_desc, extra, - } => self.display_line_entry(*number, spans, *time, *kind, text, *has_desc, extra), + } => self + .display_line_entry(*number, spans, *today, *time, *kind, text, *has_desc, extra), } } @@ -99,6 +101,7 @@ impl ShowLines { &mut self, number: Option, spans: &[Option], + today: bool, time: Times, kind: LineKind, text: &str, @@ -110,6 +113,12 @@ impl ShowLines { None => "".to_string(), }; + let text = if kind == LineKind::Birthday && today { + util::display_current_birthday_text(text) + } else { + text.into() + }; + self.push(&format!( "{:>nw$} {} {}{} {}{}{}\n", num.bright_black(), diff --git a/src/cli/util.rs b/src/cli/util.rs index 5d1c3d5..e862088 100644 --- a/src/cli/util.rs +++ b/src/cli/util.rs @@ -13,6 +13,10 @@ pub fn display_kind(kind: LineKind) -> ColoredString { } } +pub fn display_current_birthday_text(text: &str) -> ColoredString { + text.yellow() +} + pub fn edit(input: &str) -> Result { edit::edit(input).map_err(Error::EditingIo) } From f42cf01a158eb2af9f1682312e2f838f949d1340 Mon Sep 17 00:00:00 2001 From: Joscha Date: Mon, 2 May 2022 12:49:03 +0200 Subject: [PATCH 03/20] Fix cli arg anchoring --- CHANGELOG.md | 3 +++ src/files/cli.rs | 31 +++++++++++++++++++++++++------ src/files/grammar.pest | 9 +++++++-- 3 files changed, 35 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2c219af..9edef0d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### Changed - Birthdays for current day are now highlighted +### Fixed +- `--date` accepting incomplete expressions + ## 0.2.0 - 2022-03-18 ### Added diff --git a/src/files/cli.rs b/src/files/cli.rs index 6f72ca9..ddd804f 100644 --- a/src/files/cli.rs +++ b/src/files/cli.rs @@ -57,11 +57,17 @@ fn parse_cli_date(p: Pair<'_, Rule>) -> Result { Ok(CliDate { datum, delta }) } +fn parse_cli_date_arg(p: Pair<'_, Rule>) -> Result { + assert_eq!(p.as_rule(), Rule::cli_date_arg); + let p = p.into_inner().next().unwrap(); + parse_cli_date(p) +} + impl FromStr for CliDate { type Err = ParseError<()>; fn from_str(s: &str) -> result::Result> { - from_str_via_parse(s, Rule::cli_date, parse_cli_date) + from_str_via_parse(s, Rule::cli_date_arg, parse_cli_date_arg) } } @@ -81,11 +87,17 @@ fn parse_cli_ident(p: Pair<'_, Rule>) -> Result { }) } +fn parse_cli_ident_arg(p: Pair<'_, Rule>) -> Result { + assert_eq!(p.as_rule(), Rule::cli_ident_arg); + let p = p.into_inner().next().unwrap(); + parse_cli_ident(p) +} + impl FromStr for CliIdent { type Err = ParseError<()>; fn from_str(s: &str) -> result::Result> { - from_str_via_parse(s, Rule::cli_ident, parse_cli_ident) + from_str_via_parse(s, Rule::cli_ident_arg, parse_cli_ident_arg) } } @@ -135,11 +147,12 @@ fn parse_cli_range(p: Pair<'_, Rule>) -> Result { let (start, start_delta) = parse_cli_range_start(p.next().unwrap())?; let (end, end_delta) = match p.next() { - // For some reason, the EOI gets captured but the SOI doesn't. - Some(p) if p.as_rule() != Rule::EOI => parse_cli_range_end(p)?, - _ => (None, None), + Some(p) => parse_cli_range_end(p)?, + None => (None, None), }; + assert_eq!(p.next(), None); + Ok(CliRange { start, start_delta, @@ -148,11 +161,17 @@ fn parse_cli_range(p: Pair<'_, Rule>) -> Result { }) } +fn parse_cli_range_arg(p: Pair<'_, Rule>) -> Result { + assert_eq!(p.as_rule(), Rule::cli_range_arg); + let p = p.into_inner().next().unwrap(); + parse_cli_range(p) +} + impl FromStr for CliRange { type Err = ParseError<()>; fn from_str(s: &str) -> result::Result> { - from_str_via_parse(s, Rule::cli_range, parse_cli_range) + from_str_via_parse(s, Rule::cli_range_arg, parse_cli_range_arg) } } diff --git a/src/files/grammar.pest b/src/files/grammar.pest index 894a695..278c4b6 100644 --- a/src/files/grammar.pest +++ b/src/files/grammar.pest @@ -152,8 +152,13 @@ file = ${ SOI ~ (empty_line* ~ command)* ~ empty_line* ~ WHITESPACE* ~ EOI } today = { "today" | "t" } cli_datum = { datum | today } cli_date = { cli_datum ~ delta? } -cli_ident = { SOI ~ (cli_date | number) ~ EOI } +cli_ident = { cli_date | number } cli_range_start = { cli_datum ~ delta? } cli_range_end = { cli_datum ~ delta? | delta } -cli_range = { SOI ~ cli_range_start ~ ("--" ~ cli_range_end)? ~ EOI } +cli_range = { cli_range_start ~ ("--" ~ cli_range_end)? } + +cli_date_arg = { SOI ~ cli_date ~ EOI } +cli_ident_arg = { SOI ~ cli_ident ~ EOI } +cli_range_arg = { SOI ~ cli_range ~ EOI } + cli_command = ${ SOI ~ empty_line* ~ command ~ empty_line* ~ WHITESPACE* ~ EOI } From 972a590ba9285251add86ba8d63b2d79f16cbeb3 Mon Sep 17 00:00:00 2001 From: Joscha Date: Mon, 2 May 2022 12:57:21 +0200 Subject: [PATCH 04/20] Satisfy clippy --- src/cli/layout/day.rs | 4 ++-- src/cli/layout/line.rs | 4 +--- src/files/format.rs | 2 +- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/cli/layout/day.rs b/src/cli/layout/day.rs index e0f2d17..044269c 100644 --- a/src/cli/layout/day.rs +++ b/src/cli/layout/day.rs @@ -189,7 +189,7 @@ impl DayLayout { } } - fn sort_entries(entries: &mut Vec<(usize, &Entry)>) { + fn sort_entries(entries: &mut [(usize, &Entry)]) { // Entries should be sorted by these factors, in descending order of // significance: // 1. Their start date, if any @@ -219,7 +219,7 @@ impl DayLayout { entries.sort_by_key(|(_, e)| e.dates.map(|d| d.sorted().root_with_time())); } - fn sort_day(day: &mut Vec) { + fn sort_day(day: &mut [DayEntry]) { // In a day, entries should be sorted into these categories: // 1. Untimed entries that end at the current day // 2. Timed entries, based on diff --git a/src/cli/layout/line.rs b/src/cli/layout/line.rs index a63d45e..42cd871 100644 --- a/src/cli/layout/line.rs +++ b/src/cli/layout/line.rs @@ -174,9 +174,7 @@ impl LineLayout { self.line_entry(entries, *i, today, Times::At(*t), None); } DayEntry::TimedAt(i, t, t2) => { - let time = t2 - .map(|t2| Times::FromTo(*t, t2)) - .unwrap_or_else(|| Times::At(*t)); + let time = t2.map(|t2| Times::FromTo(*t, t2)).unwrap_or(Times::At(*t)); self.line_entry(entries, *i, today, time, None); } DayEntry::TimedStart(i, t) => { diff --git a/src/files/format.rs b/src/files/format.rs index 5f2ec3f..caa5d9b 100644 --- a/src/files/format.rs +++ b/src/files/format.rs @@ -319,7 +319,7 @@ impl fmt::Display for Command { } impl File { - fn sort(commands: &mut Vec<&Command>) { + fn sort(commands: &mut [&Command]) { // Order of commands in a file: // 1. Imports, sorted alphabetically // 2. Time zone(s) From a63529b972160b13c605c35c8ccb437dff4e2cdd Mon Sep 17 00:00:00 2001 From: Joscha Date: Wed, 4 May 2022 11:17:18 +0200 Subject: [PATCH 05/20] Increase default --range by one day --- CHANGELOG.md | 1 + src/cli.rs | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9edef0d..33ddeb8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### Changed - Birthdays for current day are now highlighted +- Default value for `--range` argument ### Fixed - `--date` accepting incomplete expressions diff --git a/src/cli.rs b/src/cli.rs index 2636f5b..401e3a3 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -33,7 +33,7 @@ pub struct Opt { #[structopt(short, long, default_value = "t")] date: String, /// Range of days to focus on - #[structopt(short, long, default_value = "t-2d--t+13d")] + #[structopt(short, long, default_value = "t-2d--t+2w")] range: String, #[structopt(subcommand)] command: Option, From bc0d2481c80393809f68209e26fee47bbeae33a5 Mon Sep 17 00:00:00 2001 From: Joscha Date: Thu, 19 May 2022 13:56:09 +0200 Subject: [PATCH 06/20] Switch from structopt to clap --- Cargo.lock | 125 +++++++++++++++++++++++++++-------------------------- Cargo.toml | 2 +- src/cli.rs | 45 ++++++++++--------- 3 files changed, 86 insertions(+), 86 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a98d22d..47f1e1a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,15 +2,6 @@ # It is not intended for manual editing. version = 3 -[[package]] -name = "ansi_term" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" -dependencies = [ - "winapi", -] - [[package]] name = "atty" version = "0.2.14" @@ -100,17 +91,41 @@ dependencies = [ [[package]] name = "clap" -version = "2.34.0" +version = "3.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" +checksum = "d2dbdf4bdacb33466e854ce889eee8dfd5729abf7ccd7664d0a2d60cd384440b" dependencies = [ - "ansi_term", "atty", "bitflags", + "clap_derive", + "clap_lex", + "indexmap", + "lazy_static", "strsim", + "termcolor", "textwrap", - "unicode-width", - "vec_map", +] + +[[package]] +name = "clap_derive" +version = "3.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25320346e922cffe59c0bbc5410c8d8784509efb321488971081313cb1e1a33c" +dependencies = [ + "heck", + "proc-macro-error", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a37c35f1112dad5e6e0b1adaff798507497a18fceeb30cceb3bae7d1427b9213" +dependencies = [ + "os_str_bytes", ] [[package]] @@ -242,13 +257,16 @@ dependencies = [ ] [[package]] -name = "heck" -version = "0.3.3" +name = "hashbrown" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" -dependencies = [ - "unicode-segmentation", -] +checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" + +[[package]] +name = "heck" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" [[package]] name = "hermit-abi" @@ -259,6 +277,16 @@ dependencies = [ "libc", ] +[[package]] +name = "indexmap" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f647032dfaa1f8b6dc29bd3edb7bbef4861b8b8007ebb118d6db284fd59f6ee" +dependencies = [ + "autocfg", + "hashbrown", +] + [[package]] name = "instant" version = "0.1.12" @@ -338,6 +366,12 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" +[[package]] +name = "os_str_bytes" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "029d8d0b2f198229de29dca79676f2738ff952edf3fde542eb8bf94d8c21b435" + [[package]] name = "pest" version = "2.1.3" @@ -500,33 +534,9 @@ dependencies = [ [[package]] name = "strsim" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" - -[[package]] -name = "structopt" -version = "0.3.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c6b5c64445ba8094a6ab0c3cd2ad323e07171012d9c98b0b15651daf1787a10" -dependencies = [ - "clap", - "lazy_static", - "structopt-derive", -] - -[[package]] -name = "structopt-derive" -version = "0.4.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcb5ae327f9cc13b68763b5749770cb9e048a99bd9dfdfa58d0cf05d5f64afe0" -dependencies = [ - "heck", - "proc-macro-error", - "proc-macro2", - "quote", - "syn", -] +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "syn" @@ -564,27 +574,24 @@ dependencies = [ [[package]] name = "textwrap" -version = "0.11.0" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" -dependencies = [ - "unicode-width", -] +checksum = "b1141d4d61095b28419e22cb0bbf02755f5e54e0526f97f1e3d1d160e60885fb" [[package]] name = "thiserror" -version = "1.0.30" +version = "1.0.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "854babe52e4df1653706b98fcfc05843010039b406875930a70e4d9644e5c417" +checksum = "bd829fe32373d27f76265620b5309d0340cb8550f523c1dda251d6298069069a" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.30" +version = "1.0.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b" +checksum = "0396bc89e626244658bef819e22d0cc459e795a5ebe878e6ec336d1674a8d79a" dependencies = [ "proc-macro2", "quote", @@ -607,6 +614,7 @@ name = "today" version = "0.2.0" dependencies = [ "chrono", + "clap", "codespan-reporting", "colored", "computus", @@ -615,7 +623,6 @@ dependencies = [ "pest", "pest_derive", "promptly", - "structopt", "termcolor", "thiserror", "tzfile", @@ -666,12 +673,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "936e4b492acfd135421d8dca4b1aa80a7bfc26e702ef3af710e0752684df5372" -[[package]] -name = "vec_map" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" - [[package]] name = "version_check" version = "0.9.4" diff --git a/Cargo.toml b/Cargo.toml index a207198..31dd4b0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,6 +5,7 @@ edition = "2021" [dependencies] chrono = "0.4.19" +clap = { version = "3.1.18", features = ["derive"] } codespan-reporting = "0.11.1" colored = "2.0.0" computus = "1.0.0" @@ -13,7 +14,6 @@ edit = "0.1.3" pest = "2.1.3" pest_derive = "2.1.0" promptly = "0.3.0" -structopt = "0.3.26" termcolor = "1.1.3" thiserror = "1.0.30" tzfile = { git = "https://github.com/Garmelon/tzfile.git", branch = "tzdir" } diff --git a/src/cli.rs b/src/cli.rs index 401e3a3..1189420 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -3,9 +3,9 @@ use std::str::FromStr; use std::{process, result}; use chrono::{NaiveDate, NaiveDateTime}; +use clap::Parser; use codespan_reporting::files::SimpleFile; use directories::ProjectDirs; -use structopt::StructOpt; use crate::eval::{self, DateRange, Entry, EntryMode}; use crate::files::cli::{CliDate, CliIdent, CliRange}; @@ -24,77 +24,76 @@ mod print; mod show; mod util; -#[derive(Debug, StructOpt)] +#[derive(Debug, clap::Parser)] pub struct Opt { /// File to load - #[structopt(short, long, parse(from_os_str))] + #[clap(short, long)] file: Option, /// Overwrite the current date - #[structopt(short, long, default_value = "t")] + #[clap(short, long, default_value = "t")] date: String, /// Range of days to focus on - #[structopt(short, long, default_value = "t-2d--t+2w")] + #[clap(short, long, default_value = "t-2d--t+2w")] range: String, - #[structopt(subcommand)] + #[clap(subcommand)] command: Option, } -#[derive(Debug, StructOpt)] +#[derive(Debug, clap::Subcommand)] pub enum Command { /// Shows individual entries in detail - #[structopt(alias = "s")] + #[clap(alias = "s")] Show { /// Entries and days to show - #[structopt(required = true)] + #[clap(required = true)] identifiers: Vec, }, /// Create a new entry based on a template - #[structopt(alias = "n")] + #[clap(alias = "n")] New { - #[structopt(subcommand)] + #[clap(subcommand)] template: Template, }, /// Marks one or more entries as done - #[structopt(alias = "d")] + #[clap(alias = "d")] Done { /// Entries to mark as done - #[structopt(required = true)] + #[clap(required = true)] entries: Vec, }, /// Marks one or more entries as canceled - #[structopt(alias = "c")] + #[clap(alias = "c")] Cancel { /// Entries to mark as done - #[structopt(required = true)] + #[clap(required = true)] entries: Vec, }, /// Edits or creates a log entry - #[structopt(alias = "l")] + #[clap(alias = "l")] Log { - #[structopt(default_value = "t")] + #[clap(default_value = "t")] date: String, }, /// Reformats all loaded files Fmt, } -// TODO Add templates for tasks and notes -#[derive(Debug, StructOpt)] +#[derive(Debug, clap::Subcommand)] pub enum Template { /// Adds a task - #[structopt(alias = "t")] + #[clap(alias = "t")] Task { /// If specified, the task is dated to this date date: Option, }, /// Adds a note - #[structopt(alias = "n")] + #[clap(alias = "n")] Note { /// If specified, the note is dated to this date date: Option, }, /// Adds an undated task marked as done today - #[structopt(alias = "d")] + #[clap(alias = "d")] Done, } @@ -222,7 +221,7 @@ fn run_with_files(opt: Opt, files: &mut Files) -> Result<()> { } pub fn run() { - let opt = Opt::from_args(); + let opt = Opt::parse(); let mut files = Files::new(); if let Err(e) = load_files(&opt, &mut files) { From aaa3537e90523bdc5798ee4c98be5a3052ebee91 Mon Sep 17 00:00:00 2001 From: Joscha Date: Thu, 19 May 2022 14:00:33 +0200 Subject: [PATCH 07/20] Update dependencies --- Cargo.lock | 64 +++++++++++++++++++++++++++--------------------------- Cargo.toml | 2 +- 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 47f1e1a..6713148 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -247,9 +247,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d39cd93900197114fa1fcb7ae84ca742095eed9442088988ae74fa744e930e77" +checksum = "9be70c98951c83b8d2f8f60d7065fa6d5146873094452a1008da8c2f1e4205ad" dependencies = [ "cfg-if 1.0.0", "libc", @@ -304,15 +304,15 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.120" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad5c14e80759d0939d013e6ca49930e59fc53dd8e5009132f76240c179380c09" +checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" [[package]] name = "log" -version = "0.4.14" +version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" dependencies = [ "cfg-if 1.0.0", ] @@ -325,9 +325,9 @@ checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" [[package]] name = "memchr" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "nix" @@ -343,9 +343,9 @@ dependencies = [ [[package]] name = "num-integer" -version = "0.1.44" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" dependencies = [ "autocfg", "num-traits", @@ -353,9 +353,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" dependencies = [ "autocfg", ] @@ -441,11 +441,11 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.36" +version = "1.0.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7342d5883fbccae1cc37a2353b09c87c9b0f3afd73f5fb9bba687a1f733b029" +checksum = "c54b25569025b7fc9651de43004ae593a75ad88543b17178aa5e1b9c4f15f56f" dependencies = [ - "unicode-xid", + "unicode-ident", ] [[package]] @@ -459,27 +459,27 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.16" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4af2ec4714533fcdf07e886f17025ace8b997b9ce51204ee69b6da831c3da57" +checksum = "a1feb54ed693b93a84e14094943b84b7c4eae204c512b7ccb95ab0c66d278ad1" dependencies = [ "proc-macro2", ] [[package]] name = "redox_syscall" -version = "0.2.11" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8380fe0152551244f0747b1bf41737e0f8a74f97a14ccefd1148187271634f3c" +checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42" dependencies = [ "bitflags", ] [[package]] name = "redox_users" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7776223e2696f1aa4c6b0170e83212f47296a00424305117d013dfe86fb0fe55" +checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" dependencies = [ "getrandom", "redox_syscall", @@ -540,13 +540,13 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "syn" -version = "1.0.89" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea297be220d52398dcc07ce15a209fce436d361735ac1db700cab3b6cdfb9f54" +checksum = "fbaf6116ab8924f39d52792136fb74fd60a80194cf1b1c6ffa6453eef1c3f942" dependencies = [ "proc-macro2", "quote", - "unicode-xid", + "unicode-ident", ] [[package]] @@ -649,6 +649,12 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c" +[[package]] +name = "unicode-ident" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d22af068fba1eb5edcb4aea19d382b2a3deb4c8f9d475c589b6ada9e0fd493ee" + [[package]] name = "unicode-segmentation" version = "1.9.0" @@ -661,12 +667,6 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" -[[package]] -name = "unicode-xid" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" - [[package]] name = "utf8parse" version = "0.2.0" @@ -687,9 +687,9 @@ checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" [[package]] name = "which" -version = "4.2.4" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a5a7e487e921cf220206864a94a89b6c6905bfc19f1057fa26a4cb360e5c1d2" +checksum = "5c4fb54e6113b6a8772ee41c3404fb0301ac79604489467e0a9ce1f3e97c24ae" dependencies = [ "either", "lazy_static", diff --git a/Cargo.toml b/Cargo.toml index 31dd4b0..a977331 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,5 +15,5 @@ pest = "2.1.3" pest_derive = "2.1.0" promptly = "0.3.0" termcolor = "1.1.3" -thiserror = "1.0.30" +thiserror = "1.0.31" tzfile = { git = "https://github.com/Garmelon/tzfile.git", branch = "tzdir" } From 36d8082c9db5aba5a56b490b41ecee9af3578103 Mon Sep 17 00:00:00 2001 From: Joscha Date: Mon, 31 Oct 2022 17:00:02 +0100 Subject: [PATCH 08/20] Update dependencies --- Cargo.lock | 596 ++++++++++++++++++++++++++++++++++++++++------------- Cargo.toml | 14 +- 2 files changed, 460 insertions(+), 150 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6713148..174496c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,15 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + [[package]] name = "atty" version = "0.2.14" @@ -27,30 +36,18 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "block-buffer" -version = "0.7.3" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" +checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e" dependencies = [ - "block-padding", - "byte-tools", - "byteorder", "generic-array", ] [[package]] -name = "block-padding" -version = "0.1.5" +name = "bumpalo" +version = "3.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" -dependencies = [ - "byte-tools", -] - -[[package]] -name = "byte-tools" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" +checksum = "572f695136211188308f16ad2ca5c851a712c464060ae6974944458eb83880ba" [[package]] name = "byteorder" @@ -60,15 +57,9 @@ checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "cc" -version = "1.0.73" +version = "1.0.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" - -[[package]] -name = "cfg-if" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" +checksum = "581f5dba903aac52ea3feb5ec4810848460ee833876f1f9b0fdeab1f19091574" [[package]] name = "cfg-if" @@ -78,39 +69,39 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.19" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" +checksum = "bfd4d1b31faaa3a89d7934dbded3111da0d2ef28e3ebccdb4f0179f5929d1ef1" dependencies = [ - "libc", + "iana-time-zone", + "js-sys", "num-integer", "num-traits", "time", + "wasm-bindgen", "winapi", ] [[package]] name = "clap" -version = "3.1.18" +version = "4.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2dbdf4bdacb33466e854ce889eee8dfd5729abf7ccd7664d0a2d60cd384440b" +checksum = "335867764ed2de42325fafe6d18b8af74ba97ee0c590fa016f157535b42ab04b" dependencies = [ "atty", "bitflags", "clap_derive", "clap_lex", - "indexmap", - "lazy_static", + "once_cell", "strsim", "termcolor", - "textwrap", ] [[package]] name = "clap_derive" -version = "3.1.18" +version = "4.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25320346e922cffe59c0bbc5410c8d8784509efb321488971081313cb1e1a33c" +checksum = "16a1b0f6422af32d5da0c58e2703320f379216ee70198241c84173a8c5ac28f3" dependencies = [ "heck", "proc-macro-error", @@ -121,13 +112,24 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a37c35f1112dad5e6e0b1adaff798507497a18fceeb30cceb3bae7d1427b9213" +checksum = "0d4198f73e42b4936b35b5bb248d81d2b595ecb170da0bac7655c54eedfa8da8" dependencies = [ "os_str_bytes", ] +[[package]] +name = "clipboard-win" +version = "4.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4ab1b92798304eedc095b53942963240037c0516452cb11aeba709d420b2219" +dependencies = [ + "error-code", + "str-buf", + "winapi", +] + [[package]] name = "codespan-reporting" version = "0.11.1" @@ -156,12 +158,82 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9eaa21df489b1e50af464db43c1fc69f60492060ac7baae3996fe8a5f476790" [[package]] -name = "digest" -version = "0.8.1" +name = "core-foundation-sys" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" +checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" + +[[package]] +name = "cpufeatures" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" +dependencies = [ + "libc", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ "generic-array", + "typenum", +] + +[[package]] +name = "cxx" +version = "1.0.80" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b7d4e43b25d3c994662706a1d4fcfc32aaa6afd287502c111b237093bb23f3a" +dependencies = [ + "cc", + "cxxbridge-flags", + "cxxbridge-macro", + "link-cplusplus", +] + +[[package]] +name = "cxx-build" +version = "1.0.80" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84f8829ddc213e2c1368e51a2564c552b65a8cb6a28f31e576270ac81d5e5827" +dependencies = [ + "cc", + "codespan-reporting", + "once_cell", + "proc-macro2", + "quote", + "scratch", + "syn", +] + +[[package]] +name = "cxxbridge-flags" +version = "1.0.80" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e72537424b474af1460806647c41d4b6d35d09ef7fe031c5c2fa5766047cc56a" + +[[package]] +name = "cxxbridge-macro" +version = "1.0.80" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "309e4fb93eed90e1e14bea0da16b209f81813ba9fc7830c20ed151dd7bc0a4d7" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "digest" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adfbc57365a37acbd2ebf2b64d7e69bb766e2fea813521ed536f5d0520dcf86c" +dependencies = [ + "block-buffer", + "crypto-common", ] [[package]] @@ -175,11 +247,11 @@ dependencies = [ [[package]] name = "dirs-next" -version = "1.0.2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf36e65a80337bea855cd4ef9b8401ffce06a7baedf2e85ec467b1ac3f6e82b6" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "dirs-sys-next", ] @@ -207,9 +279,9 @@ dependencies = [ [[package]] name = "edit" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cdd6936f8bd9782e28932eef853bfcd8548992ce5748bb3e7e88bad613d0ee0" +checksum = "c562aa71f7bc691fde4c6bf5f93ae5a5298b617c2eb44c76c87832299a17fbb4" dependencies = [ "tempfile", "which", @@ -217,51 +289,88 @@ dependencies = [ [[package]] name = "either" -version = "1.6.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" +checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" [[package]] -name = "fake-simd" +name = "endian-type" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" +checksum = "c34f04666d835ff5d62e058c3995147c06f42fe86ff053337632bca83e42702d" + +[[package]] +name = "errno" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1" +dependencies = [ + "errno-dragonfly", + "libc", + "winapi", +] + +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "error-code" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64f18991e7bf11e7ffee451b5318b5c1a73c52d0d0ada6e5a3017c8c1ced6a21" +dependencies = [ + "libc", + "str-buf", +] [[package]] name = "fastrand" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3fcf0cee53519c866c09b5de1f6c56ff9d647101f81c1964fa632e148896cdf" +checksum = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499" dependencies = [ "instant", ] [[package]] -name = "generic-array" -version = "0.12.4" +name = "fd-lock" +version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" +checksum = "e11dcc7e4d79a8c89b9ab4c6f5c30b1fc4a83c420792da3542fd31179ed5f517" +dependencies = [ + "cfg-if", + "rustix", + "windows-sys", +] + +[[package]] +name = "generic-array" +version = "0.14.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" dependencies = [ "typenum", + "version_check", ] [[package]] name = "getrandom" -version = "0.2.6" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9be70c98951c83b8d2f8f60d7065fa6d5146873094452a1008da8c2f1e4205ad" +checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", ] -[[package]] -name = "hashbrown" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" - [[package]] name = "heck" version = "0.4.0" @@ -278,13 +387,27 @@ dependencies = [ ] [[package]] -name = "indexmap" -version = "1.8.1" +name = "iana-time-zone" +version = "0.1.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f647032dfaa1f8b6dc29bd3edb7bbef4861b8b8007ebb118d6db284fd59f6ee" +checksum = "64c122667b287044802d6ce17ee2ddf13207ed924c712de9a66a5814d5b64765" dependencies = [ - "autocfg", - "hashbrown", + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "winapi", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0703ae284fc167426161c2e3f1da3ea71d94b21bedbcc9494e92b28e334e3dca" +dependencies = [ + "cxx", + "cxx-build", ] [[package]] @@ -293,7 +416,22 @@ version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", +] + +[[package]] +name = "io-lifetimes" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e481ccbe3dea62107216d0d1138bb8ad8e5e5c43009a098bd1990272c497b0" + +[[package]] +name = "js-sys" +version = "0.3.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47" +dependencies = [ + "wasm-bindgen", ] [[package]] @@ -304,9 +442,24 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.126" +version = "0.2.137" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" +checksum = "fc7fcc620a3bff7cdd7a365be3376c97191aeaccc2a603e600951e452615bf89" + +[[package]] +name = "link-cplusplus" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9272ab7b96c9046fbc5bc56c06c117cb639fe2d509df0c421cad82d2915cf369" +dependencies = [ + "cc", +] + +[[package]] +name = "linux-raw-sys" +version = "0.0.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4d2456c373231a208ad294c33dc5bff30051eafd954cd4caae83a712b12854d" [[package]] name = "log" @@ -314,15 +467,9 @@ version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", ] -[[package]] -name = "maplit" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" - [[package]] name = "memchr" version = "2.5.0" @@ -330,15 +477,34 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] -name = "nix" -version = "0.18.0" +name = "memoffset" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83450fe6a6142ddd95fb064b746083fc4ef1705fe81f64a64e1d4b39f54a1055" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +dependencies = [ + "autocfg", +] + +[[package]] +name = "nibble_vec" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a5d83df9f36fe23f0c3648c6bbb8b0298bb5f1939c8f2704431371f4b84d43" +dependencies = [ + "smallvec", +] + +[[package]] +name = "nix" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f866317acbd3a240710c63f065ffb1e4fd466259045ccb504130b7f668f35c6" dependencies = [ "bitflags", "cc", - "cfg-if 0.1.10", + "cfg-if", "libc", + "memoffset", ] [[package]] @@ -361,31 +527,32 @@ dependencies = [ ] [[package]] -name = "opaque-debug" -version = "0.2.3" +name = "once_cell" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" +checksum = "86f0b0d4bf799edbc74508c1e8bf170ff5f41238e5f8225603ca7caaae2b7860" [[package]] name = "os_str_bytes" -version = "6.0.1" +version = "6.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "029d8d0b2f198229de29dca79676f2738ff952edf3fde542eb8bf94d8c21b435" +checksum = "3baf96e39c5359d2eb0dd6ccb42c62b91d9678aa68160d261b9e0ccbf9e9dea9" [[package]] name = "pest" -version = "2.1.3" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10f4872ae94d7b90ae48754df22fd42ad52ce740b8f370b03da4835417403e53" +checksum = "dbc7bc69c062e492337d74d59b120c274fd3d261b6bf6d3207d499b4b379c41a" dependencies = [ + "thiserror", "ucd-trie", ] [[package]] name = "pest_derive" -version = "2.1.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "833d1ae558dc601e9a60366421196a8d94bc0ac980476d0b67e1d0988d72b2d0" +checksum = "60b75706b9642ebcb34dab3bc7750f811609a0eb1dd8b88c2d15bf628c1c65b2" dependencies = [ "pest", "pest_generator", @@ -393,9 +560,9 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.1.3" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99b8db626e31e5b81787b9783425769681b347011cc59471e33ea46d2ea0cf55" +checksum = "f4f9272122f5979a6511a749af9db9bfc810393f63119970d7085fed1c4ea0db" dependencies = [ "pest", "pest_meta", @@ -406,13 +573,13 @@ dependencies = [ [[package]] name = "pest_meta" -version = "2.1.3" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54be6e404f5317079812fc8f9f5279de376d8856929e21c184ecf6bbd692a11d" +checksum = "4c8717927f9b79515e565a64fe46c38b8cd0427e64c40680b14a7365ab09ac8d" dependencies = [ - "maplit", + "once_cell", "pest", - "sha-1", + "sha1", ] [[package]] @@ -441,36 +608,46 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.39" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c54b25569025b7fc9651de43004ae593a75ad88543b17178aa5e1b9c4f15f56f" +checksum = "5ea3d908b0e36316caf9e9e2c4625cdde190a7e6f440d794667ed17a1855e725" dependencies = [ "unicode-ident", ] [[package]] name = "promptly" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b99cfb0289110d969dd21637cfbc922584329bc9e5037c5e576325c615658509" +checksum = "9acbc6c5a5b029fe58342f58445acb00ccfe24624e538894bc2f04ce112980ba" dependencies = [ "rustyline", ] [[package]] name = "quote" -version = "1.0.18" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1feb54ed693b93a84e14094943b84b7c4eae204c512b7ccb95ab0c66d278ad1" +checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" dependencies = [ "proc-macro2", ] [[package]] -name = "redox_syscall" -version = "0.2.13" +name = "radix_trie" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42" +checksum = "c069c179fcdc6a2fe24d8d18305cf085fdbd4f922c041943e203685d6a1c58fd" +dependencies = [ + "endian-type", + "nibble_vec", +] + +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" dependencies = [ "bitflags", ] @@ -496,18 +673,37 @@ dependencies = [ ] [[package]] -name = "rustyline" -version = "6.3.0" +name = "rustix" +version = "0.35.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f0d5e7b0219a3eadd5439498525d4765c59b7c993ef0c12244865cd2d988413" +checksum = "985947f9b6423159c4726323f373be0a21bdb514c5af06a849cb3d2dce2d01e8" dependencies = [ - "cfg-if 0.1.10", + "bitflags", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys", + "windows-sys", +] + +[[package]] +name = "rustyline" +version = "9.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db7826789c0e25614b03e5a54a0717a86f9ff6e6e5247f92b369472869320039" +dependencies = [ + "bitflags", + "cfg-if", + "clipboard-win", "dirs-next", + "fd-lock", "libc", "log", "memchr", "nix", + "radix_trie", "scopeguard", + "smallvec", "unicode-segmentation", "unicode-width", "utf8parse", @@ -521,17 +717,34 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] -name = "sha-1" -version = "0.8.2" +name = "scratch" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d94d0bede923b3cea61f3f1ff57ff8cdfd77b400fb8f9998949e0cf04163df" +checksum = "9c8132065adcfd6e02db789d9285a0deb2f3fcb04002865ab67d5fb103533898" + +[[package]] +name = "sha1" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" dependencies = [ - "block-buffer", + "cfg-if", + "cpufeatures", "digest", - "fake-simd", - "opaque-debug", ] +[[package]] +name = "smallvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" + +[[package]] +name = "str-buf" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e08d8363704e6c71fc928674353e6b7c23dcea9d82d7012c8faf2a3a025f8d0" + [[package]] name = "strsim" version = "0.10.0" @@ -540,9 +753,9 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "syn" -version = "1.0.95" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbaf6116ab8924f39d52792136fb74fd60a80194cf1b1c6ffa6453eef1c3f942" +checksum = "a864042229133ada95abf3b54fdc62ef5ccabe9515b64717bcb9a1919e59445d" dependencies = [ "proc-macro2", "quote", @@ -555,7 +768,7 @@ version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "fastrand", "libc", "redox_syscall", @@ -572,26 +785,20 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "textwrap" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1141d4d61095b28419e22cb0bbf02755f5e54e0526f97f1e3d1d160e60885fb" - [[package]] name = "thiserror" -version = "1.0.31" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd829fe32373d27f76265620b5309d0340cb8550f523c1dda251d6298069069a" +checksum = "10deb33631e3c9018b9baf9dcbbc4f737320d2b576bac10f6aefa048fa407e3e" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.31" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0396bc89e626244658bef819e22d0cc459e795a5ebe878e6ec336d1674a8d79a" +checksum = "982d17546b47146b28f7c22e3d08465f6b8903d0ea13c1660d9d84a6e7adcdbb" dependencies = [ "proc-macro2", "quote", @@ -605,7 +812,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" dependencies = [ "libc", - "wasi", + "wasi 0.10.0+wasi-snapshot-preview1", "winapi", ] @@ -645,27 +852,27 @@ dependencies = [ [[package]] name = "ucd-trie" -version = "0.1.3" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c" +checksum = "9e79c4d996edb816c91e4308506774452e55e95c3c9de07b6729e17e15a5ef81" [[package]] name = "unicode-ident" -version = "1.0.0" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d22af068fba1eb5edcb4aea19d382b2a3deb4c8f9d475c589b6ada9e0fd493ee" +checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3" [[package]] name = "unicode-segmentation" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8820f5d777f6224dc4be3632222971ac30164d4a258d595640799554ebfd99" +checksum = "0fdbf052a0783de01e944a6ce7a8cb939e295b1e7be835a1112c3b9a7f047a5a" [[package]] name = "unicode-width" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" +checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" [[package]] name = "utf8parse" @@ -686,14 +893,74 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" [[package]] -name = "which" -version = "4.2.5" +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c4fb54e6113b6a8772ee41c3404fb0301ac79604489467e0a9ce1f3e97c24ae" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f" + +[[package]] +name = "which" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c831fbbee9e129a8cf93e7747a82da9d95ba8e16621cae60ec2cdc849bacb7b" dependencies = [ "either", - "lazy_static", "libc", + "once_cell", ] [[package]] @@ -726,3 +993,46 @@ name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" +dependencies = [ + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" + +[[package]] +name = "windows_i686_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" + +[[package]] +name = "windows_i686_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" diff --git a/Cargo.toml b/Cargo.toml index a977331..82c07b4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,16 +4,16 @@ version = "0.2.0" edition = "2021" [dependencies] -chrono = "0.4.19" -clap = { version = "3.1.18", features = ["derive"] } +chrono = "0.4.22" +clap = { version = "4.0.18", features = ["derive"] } codespan-reporting = "0.11.1" colored = "2.0.0" computus = "1.0.0" directories = "4.0.1" -edit = "0.1.3" -pest = "2.1.3" -pest_derive = "2.1.0" -promptly = "0.3.0" +edit = "0.1.4" +pest = "2.4.0" +pest_derive = "2.4.0" +promptly = "0.3.1" termcolor = "1.1.3" -thiserror = "1.0.31" +thiserror = "1.0.37" tzfile = { git = "https://github.com/Garmelon/tzfile.git", branch = "tzdir" } From 57da1026c2c0bfd7d163460d326c92f59cb94034 Mon Sep 17 00:00:00 2001 From: Joscha Date: Mon, 31 Oct 2022 17:07:10 +0100 Subject: [PATCH 09/20] Use cove lints --- src/main.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/main.rs b/src/main.rs index 5d5922f..84013df 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,17 @@ +#![deny(unsafe_code)] +// Rustc lint groups #![warn(future_incompatible)] #![warn(rust_2018_idioms)] +// Rustc lints +#![warn(noop_method_call)] +#![warn(single_use_lifetimes)] +#![warn(trivial_numeric_casts)] +#![warn(unused_crate_dependencies)] +#![warn(unused_extern_crates)] +#![warn(unused_import_braces)] +#![warn(unused_lifetimes)] +#![warn(unused_qualifications)] +// Clippy lints #![warn(clippy::all)] #![warn(clippy::use_self)] From c5a2e5dccbb4f86f8062432ac9ade45a2518469c Mon Sep 17 00:00:00 2001 From: Joscha Date: Mon, 31 Oct 2022 17:16:08 +0100 Subject: [PATCH 10/20] Fix some warnings --- src/cli/error.rs | 16 +++--- src/cli/layout/line.rs | 6 +- src/eval/command/birthday.rs | 2 +- src/eval/command/date.rs | 2 +- src/eval/command/formula.rs | 82 +++++++++++++-------------- src/eval/delta.rs | 32 +++++------ src/files/commands.rs | 104 +++++++++++++++++------------------ src/files/error.rs | 18 +++--- src/files/format.rs | 86 ++++++++++++++--------------- src/files/primitives.rs | 14 ++--- 10 files changed, 181 insertions(+), 181 deletions(-) diff --git a/src/cli/error.rs b/src/cli/error.rs index 929650a..ef35e12 100644 --- a/src/cli/error.rs +++ b/src/cli/error.rs @@ -42,12 +42,12 @@ where { fn eprint<'f: 'a>(&self, files: &'f F, config: &Config) { match self { - Error::Eval(e) => e.eprint(files, config), - Error::ArgumentParse { file, error } => error.eprint(file, config), - Error::ArgumentEval { file, error } => error.eprint(file, config), - Error::NoSuchEntry(n) => eprintln!("No entry with number {n}"), - Error::NoSuchLog(date) => eprintln!("No log for {date}"), - Error::NotATask(ns) => { + Self::Eval(e) => e.eprint(files, config), + Self::ArgumentParse { file, error } => error.eprint(file, config), + Self::ArgumentEval { file, error } => error.eprint(file, config), + Self::NoSuchEntry(n) => eprintln!("No entry with number {n}"), + Self::NoSuchLog(date) => eprintln!("No log for {date}"), + Self::NotATask(ns) => { if ns.is_empty() { eprintln!("Not a task."); } else if ns.len() == 1 { @@ -57,8 +57,8 @@ where eprintln!("{} are not tasks.", ns.join(", ")); } } - Error::NoCaptureFile => eprintln!("No capture file found"), - Error::EditingIo(error) => { + Self::NoCaptureFile => eprintln!("No capture file found"), + Self::EditingIo(error) => { eprintln!("Error while editing:"); eprintln!(" {error}"); } diff --git a/src/cli/layout/line.rs b/src/cli/layout/line.rs index 42cd871..79d0a43 100644 --- a/src/cli/layout/line.rs +++ b/src/cli/layout/line.rs @@ -42,9 +42,9 @@ pub enum SpanSegment { impl SpanSegment { fn style(&self) -> SpanStyle { match self { - SpanSegment::Start(s) => *s, - SpanSegment::Middle(s) => *s, - SpanSegment::End(s) => *s, + Self::Start(s) => *s, + Self::Middle(s) => *s, + Self::End(s) => *s, } } } diff --git a/src/eval/command/birthday.rs b/src/eval/command/birthday.rs index cec1d2e..4f0cb32 100644 --- a/src/eval/command/birthday.rs +++ b/src/eval/command/birthday.rs @@ -8,7 +8,7 @@ use super::super::date::Dates; use super::super::error::Error; use super::super::EntryKind; -impl<'a> CommandState<'a> { +impl CommandState<'_> { pub fn eval_birthday_spec(&mut self, spec: &BirthdaySpec) -> Result<(), Error> { let range = match self.limit_from_until(self.range_with_remind()) { Some(range) => range, diff --git a/src/eval/command/date.rs b/src/eval/command/date.rs index f7ddacb..9a895c2 100644 --- a/src/eval/command/date.rs +++ b/src/eval/command/date.rs @@ -137,7 +137,7 @@ impl DateSpec { } } -impl<'a> CommandState<'a> { +impl CommandState<'_> { pub fn eval_date_spec(&mut self, spec: DateSpec) -> Result<(), Error> { let index = self.source.file(); if let Some(repeat) = &spec.repeat { diff --git a/src/eval/command/formula.rs b/src/eval/command/formula.rs index c9a8692..f50e0d8 100644 --- a/src/eval/command/formula.rs +++ b/src/eval/command/formula.rs @@ -51,38 +51,38 @@ pub enum Var { impl Var { fn eval(self, index: S, date: NaiveDate) -> Result> { Ok(match self { - Var::JulianDay => date.num_days_from_ce().into(), - Var::Year => date.year().into(), - Var::YearLength => util::year_length(date.year()).into(), - Var::YearDay => date.ordinal().into(), - Var::YearDayReverse => (util::year_length(date.year()) - date.ordinal0()).into(), - Var::YearWeek => (date.ordinal0().div_euclid(7) + 1).into(), - Var::YearWeekReverse => { + Self::JulianDay => date.num_days_from_ce().into(), + Self::Year => date.year().into(), + Self::YearLength => util::year_length(date.year()).into(), + Self::YearDay => date.ordinal().into(), + Self::YearDayReverse => (util::year_length(date.year()) - date.ordinal0()).into(), + Self::YearWeek => (date.ordinal0().div_euclid(7) + 1).into(), + Self::YearWeekReverse => { #[allow(non_snake_case)] let yD = util::year_length(date.year()) - date.ordinal(); (yD.div_euclid(7) + 1).into() } - Var::Month => date.month().into(), - Var::MonthLength => util::month_length(date.year(), date.month()).into(), - Var::MonthWeek => (date.day0().div_euclid(7) + 1).into(), - Var::MonthWeekReverse => { + Self::Month => date.month().into(), + Self::MonthLength => util::month_length(date.year(), date.month()).into(), + Self::MonthWeek => (date.day0().div_euclid(7) + 1).into(), + Self::MonthWeekReverse => { #[allow(non_snake_case)] let mD = util::month_length(date.year(), date.month()) - date.day(); (mD.div_euclid(7) + 1).into() } - Var::Day => date.day().into(), - Var::DayReverse => { + Self::Day => date.day().into(), + Self::DayReverse => { let ml = util::month_length(date.year(), date.month()); (ml - date.day0()).into() } - Var::IsoYear => date.iso_week().year().into(), - Var::IsoYearLength => util::iso_year_length(date.iso_week().year()).into(), - Var::IsoWeek => date.iso_week().week().into(), - Var::Weekday => { + Self::IsoYear => date.iso_week().year().into(), + Self::IsoYearLength => util::iso_year_length(date.iso_week().year()).into(), + Self::IsoWeek => date.iso_week().week().into(), + Self::Weekday => { let wd: Weekday = date.weekday().into(); wd.num().into() } - Var::Easter(span) => { + Self::Easter(span) => { let e = computus::gregorian(date.year()).map_err(|e| Error::Easter { index, span, @@ -91,16 +91,16 @@ impl Var { })?; NaiveDate::from_ymd(e.year, e.month, e.day).ordinal().into() } - Var::IsWeekday => { + Self::IsWeekday => { let wd: Weekday = date.weekday().into(); b2i(!wd.is_weekend()) } - Var::IsWeekend => { + Self::IsWeekend => { let wd: Weekday = date.weekday().into(); b2i(wd.is_weekend()) } - Var::IsLeapYear => b2i(util::is_leap_year(date.year())), - Var::IsIsoLeapYear => b2i(util::is_iso_leap_year(date.year())), + Self::IsLeapYear => b2i(util::is_leap_year(date.year())), + Self::IsIsoLeapYear => b2i(util::is_iso_leap_year(date.year())), }) } } @@ -206,13 +206,13 @@ impl From for Expr { impl Expr { fn eval(&self, index: S, date: NaiveDate) -> Result> { Ok(match self { - Expr::Lit(l) => *l, - Expr::Var(v) => v.eval(index, date)?, - Expr::Neg(e) => -e.eval(index, date)?, - Expr::Add(a, b) => a.eval(index, date)? + b.eval(index, date)?, - Expr::Sub(a, b) => a.eval(index, date)? - b.eval(index, date)?, - Expr::Mul(a, b) => a.eval(index, date)? * b.eval(index, date)?, - Expr::Div(a, b, span) => { + Self::Lit(l) => *l, + Self::Var(v) => v.eval(index, date)?, + Self::Neg(e) => -e.eval(index, date)?, + Self::Add(a, b) => a.eval(index, date)? + b.eval(index, date)?, + Self::Sub(a, b) => a.eval(index, date)? - b.eval(index, date)?, + Self::Mul(a, b) => a.eval(index, date)? * b.eval(index, date)?, + Self::Div(a, b, span) => { let b = b.eval(index, date)?; if b == 0 { return Err(Error::DivByZero { @@ -223,7 +223,7 @@ impl Expr { } a.eval(index, date)?.div_euclid(b) } - Expr::Mod(a, b, span) => { + Self::Mod(a, b, span) => { let b = b.eval(index, date)?; if b == 0 { return Err(Error::ModByZero { @@ -234,16 +234,16 @@ impl Expr { } a.eval(index, date)?.rem_euclid(b) } - Expr::Eq(a, b) => b2i(a.eval(index, date)? == b.eval(index, date)?), - Expr::Neq(a, b) => b2i(a.eval(index, date)? != b.eval(index, date)?), - Expr::Lt(a, b) => b2i(a.eval(index, date)? < b.eval(index, date)?), - Expr::Lte(a, b) => b2i(a.eval(index, date)? <= b.eval(index, date)?), - Expr::Gt(a, b) => b2i(a.eval(index, date)? > b.eval(index, date)?), - Expr::Gte(a, b) => b2i(a.eval(index, date)? >= b.eval(index, date)?), - Expr::Not(e) => b2i(!i2b(e.eval(index, date)?)), - Expr::And(a, b) => b2i(i2b(a.eval(index, date)?) && i2b(b.eval(index, date)?)), - Expr::Or(a, b) => b2i(i2b(a.eval(index, date)?) || i2b(b.eval(index, date)?)), - Expr::Xor(a, b) => b2i(i2b(a.eval(index, date)?) ^ i2b(b.eval(index, date)?)), + Self::Eq(a, b) => b2i(a.eval(index, date)? == b.eval(index, date)?), + Self::Neq(a, b) => b2i(a.eval(index, date)? != b.eval(index, date)?), + Self::Lt(a, b) => b2i(a.eval(index, date)? < b.eval(index, date)?), + Self::Lte(a, b) => b2i(a.eval(index, date)? <= b.eval(index, date)?), + Self::Gt(a, b) => b2i(a.eval(index, date)? > b.eval(index, date)?), + Self::Gte(a, b) => b2i(a.eval(index, date)? >= b.eval(index, date)?), + Self::Not(e) => b2i(!i2b(e.eval(index, date)?)), + Self::And(a, b) => b2i(i2b(a.eval(index, date)?) && i2b(b.eval(index, date)?)), + Self::Or(a, b) => b2i(i2b(a.eval(index, date)?) || i2b(b.eval(index, date)?)), + Self::Xor(a, b) => b2i(i2b(a.eval(index, date)?) ^ i2b(b.eval(index, date)?)), }) } } @@ -362,7 +362,7 @@ impl FormulaSpec { } } -impl<'a> CommandState<'a> { +impl CommandState<'_> { pub fn eval_formula_spec(&mut self, spec: FormulaSpec) -> Result<(), Error> { if let Some(range) = spec.range(self) { let index = self.source.file(); diff --git a/src/eval/delta.rs b/src/eval/delta.rs index 364a226..f390cf2 100644 --- a/src/eval/delta.rs +++ b/src/eval/delta.rs @@ -43,84 +43,84 @@ impl DeltaStep { /// A lower bound on days fn lower_bound(&self) -> i32 { match self { - DeltaStep::Year(n) => { + Self::Year(n) => { if *n < 0 { *n * 366 } else { *n * 365 } } - DeltaStep::Month(n) | DeltaStep::MonthReverse(n) => { + Self::Month(n) | Self::MonthReverse(n) => { if *n < 0 { *n * 31 } else { *n * 28 } } - DeltaStep::Day(n) => *n, - DeltaStep::Week(n) => *n * 7, - DeltaStep::Hour(n) => { + Self::Day(n) => *n, + Self::Week(n) => *n * 7, + Self::Hour(n) => { if *n < 0 { *n / 24 + (*n % 24).signum() } else { *n / 24 } } - DeltaStep::Minute(n) => { + Self::Minute(n) => { if *n < 0 { *n / (24 * 60) + (*n % (24 * 60)).signum() } else { *n / (24 * 60) } } - DeltaStep::Weekday(n, _) => match n.cmp(&0) { + Self::Weekday(n, _) => match n.cmp(&0) { Ordering::Less => *n * 7 - 1, Ordering::Equal => 0, Ordering::Greater => *n * 7 - 7, }, - DeltaStep::Time(_) => 0, + Self::Time(_) => 0, } } /// An upper bound on days fn upper_bound(&self) -> i32 { match self { - DeltaStep::Year(n) => { + Self::Year(n) => { if *n > 0 { *n * 366 } else { *n * 365 } } - DeltaStep::Month(n) | DeltaStep::MonthReverse(n) => { + Self::Month(n) | Self::MonthReverse(n) => { if *n > 0 { *n * 31 } else { *n * 28 } } - DeltaStep::Day(n) => *n, - DeltaStep::Week(n) => *n * 7, - DeltaStep::Hour(n) => { + Self::Day(n) => *n, + Self::Week(n) => *n * 7, + Self::Hour(n) => { if *n > 0 { *n / 24 + (*n % 24).signum() } else { *n / 24 } } - DeltaStep::Minute(n) => { + Self::Minute(n) => { if *n > 0 { *n / (24 * 60) + (*n % (24 * 60)).signum() } else { *n / (24 * 60) } } - DeltaStep::Weekday(n, _) => match n.cmp(&0) { + Self::Weekday(n, _) => match n.cmp(&0) { Ordering::Less => *n * 7 - 7, Ordering::Equal => 0, Ordering::Greater => *n * 7 - 1, }, - DeltaStep::Time(_) => 1, + Self::Time(_) => 1, } } } diff --git a/src/files/commands.rs b/src/files/commands.rs index 483fd7a..e3ff9d3 100644 --- a/src/files/commands.rs +++ b/src/files/commands.rs @@ -27,27 +27,27 @@ pub enum DeltaStep { impl DeltaStep { pub fn amount(&self) -> i32 { match self { - DeltaStep::Year(i) => *i, - DeltaStep::Month(i) => *i, - DeltaStep::MonthReverse(i) => *i, - DeltaStep::Day(i) => *i, - DeltaStep::Week(i) => *i, - DeltaStep::Hour(i) => *i, - DeltaStep::Minute(i) => *i, - DeltaStep::Weekday(i, _) => *i, + Self::Year(i) => *i, + Self::Month(i) => *i, + Self::MonthReverse(i) => *i, + Self::Day(i) => *i, + Self::Week(i) => *i, + Self::Hour(i) => *i, + Self::Minute(i) => *i, + Self::Weekday(i, _) => *i, } } pub fn name(&self) -> &'static str { match self { - DeltaStep::Year(_) => "y", - DeltaStep::Month(_) => "m", - DeltaStep::MonthReverse(_) => "M", - DeltaStep::Day(_) => "d", - DeltaStep::Week(_) => "w", - DeltaStep::Hour(_) => "h", - DeltaStep::Minute(_) => "min", - DeltaStep::Weekday(_, wd) => wd.name(), + Self::Year(_) => "y", + Self::Month(_) => "m", + Self::MonthReverse(_) => "M", + Self::Day(_) => "d", + Self::Week(_) => "w", + Self::Hour(_) => "h", + Self::Minute(_) => "min", + Self::Weekday(_, wd) => wd.name(), } } } @@ -168,39 +168,39 @@ impl Var { pub fn name(&self) -> &'static str { match self { // Constants - Var::True => "true", - Var::False => "false", - Var::Monday => "mon", - Var::Tuesday => "tue", - Var::Wednesday => "wed", - Var::Thursday => "thu", - Var::Friday => "fri", - Var::Saturday => "sat", - Var::Sunday => "sun", + Self::True => "true", + Self::False => "false", + Self::Monday => "mon", + Self::Tuesday => "tue", + Self::Wednesday => "wed", + Self::Thursday => "thu", + Self::Friday => "fri", + Self::Saturday => "sat", + Self::Sunday => "sun", // Variables - Var::JulianDay => "j", - Var::Year => "y", - Var::YearLength => "yl", - Var::YearDay => "yd", - Var::YearDayReverse => "yD", - Var::YearWeek => "yw", - Var::YearWeekReverse => "yW", - Var::Month => "m", - Var::MonthLength => "ml", - Var::MonthWeek => "mw", - Var::MonthWeekReverse => "mW", - Var::Day => "d", - Var::DayReverse => "D", - Var::IsoYear => "iy", - Var::IsoYearLength => "iyl", - Var::IsoWeek => "iw", - Var::Weekday => "wd", - Var::Easter => "e", + Self::JulianDay => "j", + Self::Year => "y", + Self::YearLength => "yl", + Self::YearDay => "yd", + Self::YearDayReverse => "yD", + Self::YearWeek => "yw", + Self::YearWeekReverse => "yW", + Self::Month => "m", + Self::MonthLength => "ml", + Self::MonthWeek => "mw", + Self::MonthWeekReverse => "mW", + Self::Day => "d", + Self::DayReverse => "D", + Self::IsoYear => "iy", + Self::IsoYearLength => "iyl", + Self::IsoWeek => "iw", + Self::Weekday => "wd", + Self::Easter => "e", // Variables with "boolean" values - Var::IsWeekday => "isWeekday", - Var::IsWeekend => "isWeekend", - Var::IsLeapYear => "isLeapYear", - Var::IsIsoLeapYear => "isIsoLeapYear", + Self::IsWeekday => "isWeekday", + Self::IsWeekend => "isWeekend", + Self::IsLeapYear => "isLeapYear", + Self::IsIsoLeapYear => "isIsoLeapYear", } } } @@ -301,11 +301,11 @@ pub enum DoneDate { impl DoneDate { pub fn root(self) -> NaiveDate { match self { - DoneDate::Date { root } => root, - DoneDate::DateTime { root, .. } => root, - DoneDate::DateToDate { root, .. } => root, - DoneDate::DateTimeToTime { root, .. } => root, - DoneDate::DateTimeToDateTime { root, .. } => root, + Self::Date { root } => root, + Self::DateTime { root, .. } => root, + Self::DateToDate { root, .. } => root, + Self::DateTimeToTime { root, .. } => root, + Self::DateTimeToDateTime { root, .. } => root, } } diff --git a/src/files/error.rs b/src/files/error.rs index f0ad33e..40fa7f7 100644 --- a/src/files/error.rs +++ b/src/files/error.rs @@ -134,19 +134,19 @@ pub enum Error { impl<'a> Eprint<'a, Files> for Error { fn eprint<'f: 'a>(&self, files: &'f Files, config: &Config) { match self { - Error::ResolvePath { path, error } => { + Self::ResolvePath { path, error } => { eprintln!("Could not resolve path {path:?}:"); eprintln!(" {error}"); } - Error::ReadFile { file, error } => { + Self::ReadFile { file, error } => { eprintln!("Could not read file {file:?}:"); eprintln!(" {error}"); } - Error::WriteFile { file, error } => { + Self::WriteFile { file, error } => { eprintln!("Could not write file {file:?}:"); eprintln!(" {error}"); } - Error::ResolveTz { + Self::ResolveTz { file, span, tz, @@ -158,14 +158,14 @@ impl<'a> Eprint<'a, Files> for Error { .with_notes(vec![format!("{error}")]); Self::eprint_diagnostic(files, config, &diagnostic); } - Error::LocalTz { error } => { + Self::LocalTz { error } => { eprintln!("Could not determine local timezone:"); eprintln!(" {error}"); } - Error::Parse { file, error } => { + Self::Parse { file, error } => { ParseError::new(*file, error.clone()).eprint(files, config) } - Error::TzConflict { + Self::TzConflict { file1, span1, tz1, @@ -184,7 +184,7 @@ impl<'a> Eprint<'a, Files> for Error { ]); Self::eprint_diagnostic(files, config, &diagnostic); } - Error::MultipleCapture { + Self::MultipleCapture { file1, span1, file2, @@ -201,7 +201,7 @@ impl<'a> Eprint<'a, Files> for Error { ]); Self::eprint_diagnostic(files, config, &diagnostic); } - Error::LogConflict { + Self::LogConflict { file1, span1, file2, diff --git a/src/files/format.rs b/src/files/format.rs index caa5d9b..280d58c 100644 --- a/src/files/format.rs +++ b/src/files/format.rs @@ -140,25 +140,25 @@ impl fmt::Display for Var { impl fmt::Display for Expr { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { - Expr::Lit(i) => write!(f, "{i}"), - Expr::Var(v) => write!(f, "{v}"), - Expr::Paren(e) => write!(f, "({e})"), - Expr::Neg(e) => write!(f, "-{e}"), - Expr::Add(a, b) => write!(f, "{a} + {b}"), - Expr::Sub(a, b) => write!(f, "{a} - {b}"), - Expr::Mul(a, b) => write!(f, "{a} * {b}"), - Expr::Div(a, b) => write!(f, "{a} / {b}"), - Expr::Mod(a, b) => write!(f, "{a} % {b}"), - Expr::Eq(a, b) => write!(f, "{a} = {b}"), - Expr::Neq(a, b) => write!(f, "{a} != {b}"), - Expr::Lt(a, b) => write!(f, "{a} < {b}"), - Expr::Lte(a, b) => write!(f, "{a} <= {b}"), - Expr::Gt(a, b) => write!(f, "{a} > {b}"), - Expr::Gte(a, b) => write!(f, "{a} >= {b}"), - Expr::Not(e) => write!(f, "!{e}"), - Expr::And(a, b) => write!(f, "{a} & {b}"), - Expr::Or(a, b) => write!(f, "{a} | {b}"), - Expr::Xor(a, b) => write!(f, "{a} ^ {b}"), + Self::Lit(i) => write!(f, "{i}"), + Self::Var(v) => write!(f, "{v}"), + Self::Paren(e) => write!(f, "({e})"), + Self::Neg(e) => write!(f, "-{e}"), + Self::Add(a, b) => write!(f, "{a} + {b}"), + Self::Sub(a, b) => write!(f, "{a} - {b}"), + Self::Mul(a, b) => write!(f, "{a} * {b}"), + Self::Div(a, b) => write!(f, "{a} / {b}"), + Self::Mod(a, b) => write!(f, "{a} % {b}"), + Self::Eq(a, b) => write!(f, "{a} = {b}"), + Self::Neq(a, b) => write!(f, "{a} != {b}"), + Self::Lt(a, b) => write!(f, "{a} < {b}"), + Self::Lte(a, b) => write!(f, "{a} <= {b}"), + Self::Gt(a, b) => write!(f, "{a} > {b}"), + Self::Gte(a, b) => write!(f, "{a} >= {b}"), + Self::Not(e) => write!(f, "!{e}"), + Self::And(a, b) => write!(f, "{a} & {b}"), + Self::Or(a, b) => write!(f, "{a} | {b}"), + Self::Xor(a, b) => write!(f, "{a} ^ {b}"), } } } @@ -196,9 +196,9 @@ impl fmt::Display for FormulaSpec { impl fmt::Display for Spec { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { - Spec::Date(spec) => write!(f, "{spec}"), - Spec::Weekday(spec) => write!(f, "{spec}"), - Spec::Formula(spec) => write!(f, "{spec}"), + Self::Date(spec) => write!(f, "{spec}"), + Self::Weekday(spec) => write!(f, "{spec}"), + Self::Formula(spec) => write!(f, "{spec}"), } } } @@ -216,14 +216,14 @@ impl fmt::Display for BirthdaySpec { impl fmt::Display for Statement { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { - Statement::Date(spec) => writeln!(f, "DATE {spec}"), - Statement::BDate(spec) => writeln!(f, "BDATE {spec}"), - Statement::From(Some(date)) => writeln!(f, "FROM {date}"), - Statement::From(None) => writeln!(f, "FROM *"), - Statement::Until(Some(date)) => writeln!(f, "UNTIL {date}"), - Statement::Until(None) => writeln!(f, "UNTIL *"), - Statement::Except(date) => writeln!(f, "EXCEPT {date}"), - Statement::Move { + Self::Date(spec) => writeln!(f, "DATE {spec}"), + Self::BDate(spec) => writeln!(f, "BDATE {spec}"), + Self::From(Some(date)) => writeln!(f, "FROM {date}"), + Self::From(None) => writeln!(f, "FROM *"), + Self::Until(Some(date)) => writeln!(f, "UNTIL {date}"), + Self::Until(None) => writeln!(f, "UNTIL *"), + Self::Except(date) => writeln!(f, "EXCEPT {date}"), + Self::Move { from, to, to_time, .. } => match (to, to_time) { (None, None) => unreachable!(), @@ -231,8 +231,8 @@ impl fmt::Display for Statement { (None, Some(to_time)) => writeln!(f, "MOVE {from} TO {to_time}"), (Some(to), Some(to_time)) => writeln!(f, "MOVE {from} TO {to} {to_time}"), }, - Statement::Remind(Some(delta)) => writeln!(f, "REMIND {delta}"), - Statement::Remind(None) => writeln!(f, "REMIND *"), + Self::Remind(Some(delta)) => writeln!(f, "REMIND {delta}"), + Self::Remind(None) => writeln!(f, "REMIND *"), } } } @@ -240,15 +240,15 @@ impl fmt::Display for Statement { impl fmt::Display for DoneDate { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self.simplified() { - DoneDate::Date { root } => write!(f, "{root}"), - DoneDate::DateTime { root, root_time } => write!(f, "{root} {root_time}"), - DoneDate::DateToDate { root, other } => write!(f, "{root} -- {other}"), - DoneDate::DateTimeToTime { + Self::Date { root } => write!(f, "{root}"), + Self::DateTime { root, root_time } => write!(f, "{root} {root_time}"), + Self::DateToDate { root, other } => write!(f, "{root} -- {other}"), + Self::DateTimeToTime { root, root_time, other_time, } => write!(f, "{root} {root_time} -- {other_time}"), - DoneDate::DateTimeToDateTime { + Self::DateTimeToDateTime { root, root_time, other, @@ -308,12 +308,12 @@ impl fmt::Display for Log { impl fmt::Display for Command { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { - Command::Include(name) => writeln!(f, "INCLUDE {name}"), - Command::Timezone(name) => writeln!(f, "TIMEZONE {name}"), - Command::Capture => writeln!(f, "CAPTURE"), - Command::Task(task) => write!(f, "{task}"), - Command::Note(note) => write!(f, "{note}"), - Command::Log(log) => write!(f, "{log}"), + Self::Include(name) => writeln!(f, "INCLUDE {name}"), + Self::Timezone(name) => writeln!(f, "TIMEZONE {name}"), + Self::Capture => writeln!(f, "CAPTURE"), + Self::Task(task) => write!(f, "{task}"), + Self::Note(note) => write!(f, "{note}"), + Self::Log(log) => write!(f, "{log}"), } } } diff --git a/src/files/primitives.rs b/src/files/primitives.rs index e63b867..b4a9dc2 100644 --- a/src/files/primitives.rs +++ b/src/files/primitives.rs @@ -206,13 +206,13 @@ impl Weekday { /// `Saturday`, `Sunday`). pub fn full_name(self) -> &'static str { match self { - Weekday::Monday => "Monday", - Weekday::Tuesday => "Tuesday", - Weekday::Wednesday => "Wednesday", - Weekday::Thursday => "Thursday", - Weekday::Friday => "Friday", - Weekday::Saturday => "Saturday", - Weekday::Sunday => "Sunday", + Self::Monday => "Monday", + Self::Tuesday => "Tuesday", + Self::Wednesday => "Wednesday", + Self::Thursday => "Thursday", + Self::Friday => "Friday", + Self::Saturday => "Saturday", + Self::Sunday => "Sunday", } } From f01c3818c0209196ded18e20af6cbe72d8cd9a19 Mon Sep 17 00:00:00 2001 From: Joscha Date: Mon, 31 Oct 2022 18:06:49 +0100 Subject: [PATCH 11/20] Ignore some false positives --- src/cli/error.rs | 1 + src/error.rs | 3 +++ src/eval/error.rs | 1 + src/files/error.rs | 2 ++ 4 files changed, 7 insertions(+) diff --git a/src/cli/error.rs b/src/cli/error.rs index ef35e12..05b239a 100644 --- a/src/cli/error.rs +++ b/src/cli/error.rs @@ -40,6 +40,7 @@ impl<'a, F> Eprint<'a, F> for Error where F: Files<'a, FileId = FileSource>, { + #[allow(single_use_lifetimes)] fn eprint<'f: 'a>(&self, files: &'f F, config: &Config) { match self { Self::Eval(e) => e.eprint(files, config), diff --git a/src/error.rs b/src/error.rs index b8a658e..2cee250 100644 --- a/src/error.rs +++ b/src/error.rs @@ -4,6 +4,7 @@ use codespan_reporting::term::{self, Config}; use termcolor::StandardStream; pub trait Eprint<'a, F: Files<'a>> { + #[allow(single_use_lifetimes)] fn eprint_diagnostic<'f: 'a>( files: &'f F, config: &Config, @@ -15,9 +16,11 @@ pub trait Eprint<'a, F: Files<'a>> { } } + #[allow(single_use_lifetimes)] fn eprint<'f: 'a>(&self, files: &'f F, config: &Config); } +#[allow(single_use_lifetimes)] pub fn eprint_error<'a, 'f: 'a, F, E>(files: &'f F, e: &E) where F: Files<'a>, diff --git a/src/eval/error.rs b/src/eval/error.rs index d2cd7dd..d2225fb 100644 --- a/src/eval/error.rs +++ b/src/eval/error.rs @@ -88,6 +88,7 @@ impl Error { } impl<'a, F: Files<'a>> Eprint<'a, F> for Error { + #[allow(single_use_lifetimes)] fn eprint<'f: 'a>(&self, files: &'f F, config: &Config) { let diagnostic = match self { Error::DeltaInvalidStep { diff --git a/src/files/error.rs b/src/files/error.rs index 40fa7f7..f2e961a 100644 --- a/src/files/error.rs +++ b/src/files/error.rs @@ -69,6 +69,7 @@ impl<'a, F> Eprint<'a, F> for ParseError where F: codespan_reporting::files::Files<'a>, { + #[allow(single_use_lifetimes)] fn eprint<'f: 'a>(&self, files: &'f F, config: &Config) { let range = match self.error.location { InputLocation::Pos(at) => at..at, @@ -132,6 +133,7 @@ pub enum Error { } impl<'a> Eprint<'a, Files> for Error { + #[allow(single_use_lifetimes)] fn eprint<'f: 'a>(&self, files: &'f Files, config: &Config) { match self { Self::ResolvePath { path, error } => { From 11d9a2f1c7534f697b455cdabe8392006e263db9 Mon Sep 17 00:00:00 2001 From: Joscha Date: Tue, 1 Nov 2022 14:55:08 +0100 Subject: [PATCH 12/20] Switch to pratt parser --- src/files/parse.rs | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/src/files/parse.rs b/src/files/parse.rs index 574d785..90d9ffe 100644 --- a/src/files/parse.rs +++ b/src/files/parse.rs @@ -4,7 +4,7 @@ use std::result; use chrono::NaiveDate; use pest::error::ErrorVariant; use pest::iterators::Pair; -use pest::prec_climber::{Assoc, Operator, PrecClimber}; +use pest::pratt_parser::{Assoc, Op, PrattParser}; use pest::{Parser, Span}; use super::commands::{ @@ -429,21 +429,20 @@ fn parse_op(l: Spanned, p: Pair<'_, Rule>, r: Spanned) -> Spanned) -> Spanned { assert_eq!(p.as_rule(), Rule::expr); - fn op(rule: Rule) -> Operator { - Operator::new(rule, Assoc::Left) + fn infl(rule: Rule) -> Op { + Op::infix(rule, Assoc::Left) } - let climber = PrecClimber::new(vec![ - // Precedence from low to high - op(Rule::op_or) | op(Rule::op_xor), - op(Rule::op_and), - op(Rule::op_eq) | op(Rule::op_neq), - op(Rule::op_lt) | op(Rule::op_lte) | op(Rule::op_gt) | op(Rule::op_gte), - op(Rule::op_mul) | op(Rule::op_div) | op(Rule::op_mod), - op(Rule::op_add) | op(Rule::op_sub), - ]); - - climber.climb(p.into_inner(), parse_term, parse_op) + PrattParser::new() + .op(infl(Rule::op_or) | infl(Rule::op_xor)) + .op(infl(Rule::op_and)) + .op(infl(Rule::op_eq) | infl(Rule::op_neq)) + .op(infl(Rule::op_lt) | infl(Rule::op_lte) | infl(Rule::op_gt) | infl(Rule::op_gte)) + .op(infl(Rule::op_mul) | infl(Rule::op_div) | infl(Rule::op_mod)) + .op(infl(Rule::op_add) | infl(Rule::op_sub)) + .map_primary(parse_term) + .map_infix(parse_op) + .parse(p.into_inner()) } fn parse_date_expr_start(p: Pair<'_, Rule>, spec: &mut FormulaSpec) -> Result<()> { From 23b0a5e5fc6af410398c2c81bffba68de34901da Mon Sep 17 00:00:00 2001 From: Joscha Date: Tue, 1 Nov 2022 15:14:30 +0100 Subject: [PATCH 13/20] Use pratt parser for prefix logic --- src/files/grammar.pest | 47 ++++++++++++----------- src/files/parse.rs | 84 ++++++++++++++++++++---------------------- 2 files changed, 62 insertions(+), 69 deletions(-) diff --git a/src/files/grammar.pest b/src/files/grammar.pest index 278c4b6..a808d4e 100644 --- a/src/files/grammar.pest +++ b/src/files/grammar.pest @@ -59,34 +59,33 @@ variable = { | "e" } -unop_neg = { "-" } -unop_not = { "!" } -unop = _{ unop_neg | unop_not } +prefix_neg = { "-" } +prefix_not = { "!" } +prefix = _{ prefix_neg | prefix_not } -op_add = { "+" } -op_sub = { "-" } -op_mul = { "*" } -op_div = { "/" } -op_mod = { "%" } -op_eq = { "=" } -op_neq = { "!=" } -op_lt = { "<" } -op_lte = { "<=" } -op_gt = { ">" } -op_gte = { ">=" } -op_and = { "&" } -op_or = { "|" } -op_xor = { "^" } -op = _{ - op_add | op_sub | op_mul | op_div | op_mod - | op_eq | op_neq | op_lt | op_lte | op_gt | op_gte - | op_and | op_or | op_xor +infix_add = { "+" } +infix_sub = { "-" } +infix_mul = { "*" } +infix_div = { "/" } +infix_mod = { "%" } +infix_eq = { "=" } +infix_neq = { "!=" } +infix_lt = { "<" } +infix_lte = { "<=" } +infix_gt = { ">" } +infix_gte = { ">=" } +infix_and = { "&" } +infix_or = { "|" } +infix_xor = { "^" } +infix = _{ + infix_add | infix_sub | infix_mul | infix_div | infix_mod + | infix_eq | infix_neq | infix_lt | infix_lte | infix_gt | infix_gte + | infix_and | infix_or | infix_xor } paren_expr = { "(" ~ expr ~ ")" } -unop_expr = { unop ~ expr } -term = { number | boolean | variable | paren_expr | unop_expr } -expr = { term ~ (op ~ term)* } +term = { number | boolean | variable | paren_expr } +expr = { prefix* ~ term ~ (infix ~ prefix* ~ term)* } date_fixed_start = { datum ~ delta? ~ time? } date_fixed_end = { datum ~ delta? ~ time? | delta ~ time? | time } diff --git a/src/files/parse.rs b/src/files/parse.rs index 90d9ffe..7110075 100644 --- a/src/files/parse.rs +++ b/src/files/parse.rs @@ -359,24 +359,6 @@ fn parse_variable(p: Pair<'_, Rule>) -> Var { } } -fn parse_unop_expr(p: Pair<'_, Rule>) -> Spanned { - assert_eq!(p.as_rule(), Rule::unop_expr); - let span = (&p.as_span()).into(); - - let mut p = p.into_inner(); - let p_op = p.next().unwrap(); - let p_expr = p.next().unwrap(); - assert_eq!(p.next(), None); - - let inner = parse_expr(p_expr); - let expr = match p_op.as_rule() { - Rule::unop_neg => Expr::Neg(Box::new(inner)), - Rule::unop_not => Expr::Not(Box::new(inner)), - _ => unreachable!(), - }; - Spanned::new(span, expr) -} - fn parse_paren_expr(p: Pair<'_, Rule>) -> Spanned { assert_eq!(p.as_rule(), Rule::paren_expr); let span = (&p.as_span()).into(); @@ -392,34 +374,43 @@ fn parse_term(p: Pair<'_, Rule>) -> Spanned { Rule::number => Spanned::new(span, Expr::Lit(parse_number(p).into())), Rule::boolean => Spanned::new(span, Expr::Var(parse_boolean(p))), Rule::variable => Spanned::new(span, Expr::Var(parse_variable(p))), - Rule::unop_expr => parse_unop_expr(p), Rule::paren_expr => parse_paren_expr(p), _ => unreachable!(), } } -fn parse_op(l: Spanned, p: Pair<'_, Rule>, r: Spanned) -> Spanned { +fn parse_prefix(p: Pair<'_, Rule>, s: Spanned) -> Spanned { + let span = s.span.join((&p.as_span()).into()); + let expr = match p.as_rule() { + Rule::prefix_neg => Expr::Neg(Box::new(s)), + Rule::prefix_not => Expr::Not(Box::new(s)), + _ => unreachable!(), + }; + Spanned::new(span, expr) +} + +fn parse_infix(l: Spanned, p: Pair<'_, Rule>, r: Spanned) -> Spanned { let span = l.span.join(r.span); let expr = match p.as_rule() { // Integer-y operations - Rule::op_add => Expr::Add(Box::new(l), Box::new(r)), - Rule::op_sub => Expr::Sub(Box::new(l), Box::new(r)), - Rule::op_mul => Expr::Mul(Box::new(l), Box::new(r)), - Rule::op_div => Expr::Div(Box::new(l), Box::new(r)), - Rule::op_mod => Expr::Mod(Box::new(l), Box::new(r)), + Rule::infix_add => Expr::Add(Box::new(l), Box::new(r)), + Rule::infix_sub => Expr::Sub(Box::new(l), Box::new(r)), + Rule::infix_mul => Expr::Mul(Box::new(l), Box::new(r)), + Rule::infix_div => Expr::Div(Box::new(l), Box::new(r)), + Rule::infix_mod => Expr::Mod(Box::new(l), Box::new(r)), // Comparisons - Rule::op_eq => Expr::Eq(Box::new(l), Box::new(r)), - Rule::op_neq => Expr::Neq(Box::new(l), Box::new(r)), - Rule::op_lt => Expr::Lt(Box::new(l), Box::new(r)), - Rule::op_lte => Expr::Lte(Box::new(l), Box::new(r)), - Rule::op_gt => Expr::Gt(Box::new(l), Box::new(r)), - Rule::op_gte => Expr::Gte(Box::new(l), Box::new(r)), + Rule::infix_eq => Expr::Eq(Box::new(l), Box::new(r)), + Rule::infix_neq => Expr::Neq(Box::new(l), Box::new(r)), + Rule::infix_lt => Expr::Lt(Box::new(l), Box::new(r)), + Rule::infix_lte => Expr::Lte(Box::new(l), Box::new(r)), + Rule::infix_gt => Expr::Gt(Box::new(l), Box::new(r)), + Rule::infix_gte => Expr::Gte(Box::new(l), Box::new(r)), // Boolean-y operations - Rule::op_and => Expr::And(Box::new(l), Box::new(r)), - Rule::op_or => Expr::Or(Box::new(l), Box::new(r)), - Rule::op_xor => Expr::Xor(Box::new(l), Box::new(r)), + Rule::infix_and => Expr::And(Box::new(l), Box::new(r)), + Rule::infix_or => Expr::Or(Box::new(l), Box::new(r)), + Rule::infix_xor => Expr::Xor(Box::new(l), Box::new(r)), _ => unreachable!(), }; @@ -429,19 +420,22 @@ fn parse_op(l: Spanned, p: Pair<'_, Rule>, r: Spanned) -> Spanned) -> Spanned { assert_eq!(p.as_rule(), Rule::expr); - fn infl(rule: Rule) -> Op { - Op::infix(rule, Assoc::Left) - } - PrattParser::new() - .op(infl(Rule::op_or) | infl(Rule::op_xor)) - .op(infl(Rule::op_and)) - .op(infl(Rule::op_eq) | infl(Rule::op_neq)) - .op(infl(Rule::op_lt) | infl(Rule::op_lte) | infl(Rule::op_gt) | infl(Rule::op_gte)) - .op(infl(Rule::op_mul) | infl(Rule::op_div) | infl(Rule::op_mod)) - .op(infl(Rule::op_add) | infl(Rule::op_sub)) + .op(Op::infix(Rule::infix_or, Assoc::Left) | Op::infix(Rule::infix_xor, Assoc::Left)) + .op(Op::infix(Rule::infix_and, Assoc::Left)) + .op(Op::infix(Rule::infix_eq, Assoc::Left) | Op::infix(Rule::infix_neq, Assoc::Left)) + .op(Op::infix(Rule::infix_lt, Assoc::Left) + | Op::infix(Rule::infix_lte, Assoc::Left) + | Op::infix(Rule::infix_gt, Assoc::Left) + | Op::infix(Rule::infix_gte, Assoc::Left)) + .op(Op::infix(Rule::infix_mul, Assoc::Left) + | Op::infix(Rule::infix_div, Assoc::Left) + | Op::infix(Rule::infix_mod, Assoc::Left)) + .op(Op::infix(Rule::infix_add, Assoc::Left) | Op::infix(Rule::infix_sub, Assoc::Left)) + .op(Op::prefix(Rule::prefix_neg) | Op::prefix(Rule::prefix_not)) .map_primary(parse_term) - .map_infix(parse_op) + .map_prefix(parse_prefix) + .map_infix(parse_infix) .parse(p.into_inner()) } From f3792fae6498172d2c645b28dc6bf6949c60180d Mon Sep 17 00:00:00 2001 From: Joscha Date: Tue, 1 Nov 2022 16:41:37 +0100 Subject: [PATCH 14/20] Add marks to show which span a reminder belongs to --- CHANGELOG.md | 3 +++ src/cli/layout/line.rs | 16 +++++++++++++++- src/cli/print.rs | 1 + 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 33ddeb8..b969feb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## Unreleased +### Added +- Marks to show which span a reminder belongs to + ### Changed - Birthdays for current day are now highlighted - Default value for `--range` argument diff --git a/src/cli/layout/line.rs b/src/cli/layout/line.rs index 79d0a43..5f5d686 100644 --- a/src/cli/layout/line.rs +++ b/src/cli/layout/line.rs @@ -36,6 +36,7 @@ impl SpanStyle { pub enum SpanSegment { Start(SpanStyle), Middle(SpanStyle), + Mark(SpanStyle), End(SpanStyle), } @@ -44,6 +45,7 @@ impl SpanSegment { match self { Self::Start(s) => *s, Self::Middle(s) => *s, + Self::Mark(s) => *s, Self::End(s) => *s, } } @@ -195,6 +197,7 @@ impl LineLayout { DayEntry::ReminderWhile(i, d) => { let plural = if *d == 1 { "" } else { "s" }; let extra = format!("{d} day{plural} left"); + self.mark_span(*i); self.line_entry(entries, *i, today, Times::Untimed, Some(extra)); } DayEntry::Undated(i) => { @@ -246,6 +249,15 @@ impl LineLayout { self.spans.push(Some((index, SpanSegment::Start(style)))); } + fn mark_span(&mut self, index: usize) { + for span in self.spans.iter_mut() { + match span { + Some((i, s)) if *i == index => *s = SpanSegment::Mark(s.style()), + _ => {} + } + } + } + fn stop_span(&mut self, index: usize) { for span in self.spans.iter_mut() { match span { @@ -258,7 +270,9 @@ impl LineLayout { fn step_spans(&mut self) { for span in self.spans.iter_mut() { match span { - Some((_, s @ SpanSegment::Start(_))) => *s = SpanSegment::Middle(s.style()), + Some((_, s @ (SpanSegment::Start(_) | SpanSegment::Mark(_)))) => { + *s = SpanSegment::Middle(s.style()) + } Some((_, SpanSegment::End(_))) => *span = None, _ => {} } diff --git a/src/cli/print.rs b/src/cli/print.rs index 471cd85..cabba63 100644 --- a/src/cli/print.rs +++ b/src/cli/print.rs @@ -141,6 +141,7 @@ impl ShowLines { SpanSegment::Middle(SpanStyle::Solid) => "│".bright_black(), SpanSegment::Middle(SpanStyle::Dashed) => "╎".bright_black(), SpanSegment::Middle(SpanStyle::Dotted) => "┊".bright_black(), + SpanSegment::Mark(_) => "┝".bright_black(), SpanSegment::End(_) => "└".bright_black(), }; result.push_str(&format!("{colored_str}")); From 64c41b1073278f2eaeb3de10a13f0546f7f2b396 Mon Sep 17 00:00:00 2001 From: Joscha Date: Sat, 11 Feb 2023 21:50:38 +0100 Subject: [PATCH 15/20] Satisfy clippy --- src/files/cli.rs | 3 ++- src/files/error.rs | 6 +++--- src/files/parse.rs | 6 +++--- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/files/cli.rs b/src/files/cli.rs index ddd804f..0efbfa4 100644 --- a/src/files/cli.rs +++ b/src/files/cli.rs @@ -13,7 +13,8 @@ fn from_str_via_parse(s: &str, rule: Rule, parse: P) -> result::Result) -> Result, { - let mut pairs = TodayfileParser::parse(rule, s).map_err(|e| ParseError::new((), e))?; + let mut pairs = + TodayfileParser::parse(rule, s).map_err(|e| ParseError::new((), Box::new(e)))?; let p = pairs.next().unwrap(); assert_eq!(pairs.next(), None); diff --git a/src/files/error.rs b/src/files/error.rs index f2e961a..dde9262 100644 --- a/src/files/error.rs +++ b/src/files/error.rs @@ -15,11 +15,11 @@ use super::{parse, FileSource, Files}; #[error("{error}")] pub struct ParseError { file: S, - error: parse::Error, + error: Box, } impl ParseError { - pub fn new(file: S, error: parse::Error) -> Self { + pub fn new(file: S, error: Box) -> Self { Self { file, error } } @@ -104,7 +104,7 @@ pub enum Error { #[error("{error}")] Parse { file: FileSource, - error: parse::Error, + error: Box, }, #[error("Conflicting time zones {tz1} and {tz2}")] TzConflict { diff --git a/src/files/parse.rs b/src/files/parse.rs index 7110075..8ff2eca 100644 --- a/src/files/parse.rs +++ b/src/files/parse.rs @@ -18,7 +18,7 @@ use super::primitives::{Spanned, Time, Weekday}; pub struct TodayfileParser; pub type Error = pest::error::Error; -pub type Result = result::Result; +pub type Result = result::Result>; fn error>(span: Span<'_>, message: S) -> Error { Error::new_from_span( @@ -30,7 +30,7 @@ fn error>(span: Span<'_>, message: S) -> Error { } fn fail, T>(span: Span<'_>, message: S) -> Result { - Err(error(span, message)) + Err(Box::new(error(span, message))) } fn parse_include(p: Pair<'_, Rule>) -> Spanned { @@ -851,5 +851,5 @@ pub fn parse(path: &Path, input: &str) -> Result { let file_pair = pairs.next().unwrap(); assert_eq!(pairs.next(), None); - parse_file(file_pair).map_err(|e| e.with_path(&pathstr)) + parse_file(file_pair).map_err(|e| Box::new(e.with_path(&pathstr))) } From 4529f383fea8191c4a79ccadf475614929f3bf03 Mon Sep 17 00:00:00 2001 From: Joscha Date: Sat, 11 Feb 2023 22:12:58 +0100 Subject: [PATCH 16/20] Update chrono --- Cargo.lock | 4 +- Cargo.toml | 2 +- src/eval/command/birthday.rs | 4 +- src/eval/command/date.rs | 2 +- src/eval/command/formula.rs | 771 ++++++++++++++++++----------------- src/eval/delta.rs | 10 +- src/eval/range.rs | 2 +- src/eval/util.rs | 7 +- src/files/parse.rs | 2 +- 9 files changed, 409 insertions(+), 395 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 174496c..be2f02f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -69,9 +69,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.22" +version = "0.4.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfd4d1b31faaa3a89d7934dbded3111da0d2ef28e3ebccdb4f0179f5929d1ef1" +checksum = "16b0a3d9ed01224b22057780a37bb8c5dbfe1be8ba48678e7bf57ec4b385411f" dependencies = [ "iana-time-zone", "js-sys", diff --git a/Cargo.toml b/Cargo.toml index 82c07b4..396b6c9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,7 @@ version = "0.2.0" edition = "2021" [dependencies] -chrono = "0.4.22" +chrono = "0.4.23" clap = { version = "4.0.18", features = ["derive"] } codespan-reporting = "0.11.1" colored = "2.0.0" diff --git a/src/eval/command/birthday.rs b/src/eval/command/birthday.rs index 4f0cb32..d6c05c7 100644 --- a/src/eval/command/birthday.rs +++ b/src/eval/command/birthday.rs @@ -35,8 +35,8 @@ impl CommandState<'_> { assert_eq!(spec.date.month(), 2); assert_eq!(spec.date.day(), 29); - let first = NaiveDate::from_ymd(year, 2, 28); - let second = NaiveDate::from_ymd(year, 3, 1); + let first = NaiveDate::from_ymd_opt(year, 2, 28).unwrap(); + let second = NaiveDate::from_ymd_opt(year, 3, 1).unwrap(); self.add(self.entry_with_remind(kind, Some(Dates::new(first, second)))?); } } diff --git a/src/eval/command/date.rs b/src/eval/command/date.rs index 9a895c2..58095f8 100644 --- a/src/eval/command/date.rs +++ b/src/eval/command/date.rs @@ -85,7 +85,7 @@ impl DateSpec { let range_from = s .command .last_done_root() - .map(|date| date.succ()) + .map(|date| date.succ_opt().unwrap()) .unwrap_or(self.start); let range = s .range_with_remind() diff --git a/src/eval/command/formula.rs b/src/eval/command/formula.rs index f50e0d8..138d3ce 100644 --- a/src/eval/command/formula.rs +++ b/src/eval/command/formula.rs @@ -89,7 +89,10 @@ impl Var { date, msg: e, })?; - NaiveDate::from_ymd(e.year, e.month, e.day).ordinal().into() + NaiveDate::from_ymd_opt(e.year, e.month, e.day) + .unwrap() + .ordinal() + .into() } Self::IsWeekday => { let wd: Weekday = date.weekday().into(); @@ -332,7 +335,7 @@ impl FormulaSpec { if let EvalCommand::Task(_) = s.command { if let Some(last_done_root) = s.command.last_done_root() { - range = range.with_from(last_done_root.succ())?; + range = range.with_from(last_done_root.succ_opt().unwrap())?; } else if let Some(from) = s.from { range = range.with_from(from)?; } else if matches!(s.command, EvalCommand::Task(_)) { @@ -395,12 +398,22 @@ mod tests { } } + fn expr_ymd(e: &Expr, ymd: (i32, u32, u32), target: i64) { + let (y, m, d) = ymd; + expr(e, NaiveDate::from_ymd_opt(y, m, d).unwrap(), target); + } + + fn expr_yo(e: &Expr, yo: (i32, u32), target: i64) { + let (y, o) = yo; + expr(e, NaiveDate::from_yo_opt(y, o).unwrap(), target); + } + #[test] fn julian_day() { let e = Expr::Var(Var::JulianDay); for delta in -1000..1000 { - let d1 = NaiveDate::from_ymd(2021, 12, 19); + let d1 = NaiveDate::from_ymd_opt(2021, 12, 19).unwrap(); let d2 = d1 + Duration::days(delta); assert_eq!(e.eval((), d2).unwrap() - e.eval((), d1).unwrap(), delta); } @@ -411,21 +424,21 @@ mod tests { let e = Expr::Var(Var::Year); for y in -3000..=3000 { - expr(&e, NaiveDate::from_ymd(y, 2, 19), y.into()); + expr_ymd(&e, (y, 2, 19), y.into()); } - expr(&e, NaiveDate::from_ymd(2021, 1, 1), 2021); - expr(&e, NaiveDate::from_ymd(2021, 12, 31), 2021); + expr_ymd(&e, (2021, 1, 1), 2021); + expr_ymd(&e, (2021, 12, 31), 2021); } #[test] fn year_length() { let e = Expr::Var(Var::YearLength); - expr(&e, NaiveDate::from_ymd(2000, 12, 19), 366); - expr(&e, NaiveDate::from_ymd(2019, 12, 19), 365); - expr(&e, NaiveDate::from_ymd(2020, 12, 19), 366); - expr(&e, NaiveDate::from_ymd(2021, 12, 19), 365); + expr_ymd(&e, (2000, 12, 19), 366); + expr_ymd(&e, (2019, 12, 19), 365); + expr_ymd(&e, (2020, 12, 19), 366); + expr_ymd(&e, (2021, 12, 19), 365); } #[test] @@ -433,11 +446,11 @@ mod tests { let e = Expr::Var(Var::YearDay); for i in 1..=365 { - expr(&e, NaiveDate::from_yo(2020, i), i.into()); - expr(&e, NaiveDate::from_yo(2021, i), i.into()); + expr_yo(&e, (2020, i), i.into()); + expr_yo(&e, (2021, i), i.into()); } - expr(&e, NaiveDate::from_yo(2020, 366), 366); + expr_yo(&e, (2020, 366), 366); } #[test] @@ -445,14 +458,14 @@ mod tests { let e = Expr::Var(Var::YearDayReverse); for i in 1..=365 { - expr(&e, NaiveDate::from_yo(2020, i), (366 - i + 1).into()); - expr(&e, NaiveDate::from_yo(2021, i), (365 - i + 1).into()); + expr_yo(&e, (2020, i), (366 - i + 1).into()); + expr_yo(&e, (2021, i), (365 - i + 1).into()); } - expr(&e, NaiveDate::from_ymd(2020, 1, 1), 366); - expr(&e, NaiveDate::from_ymd(2021, 1, 1), 365); - expr(&e, NaiveDate::from_ymd(2020, 12, 31), 1); - expr(&e, NaiveDate::from_ymd(2021, 12, 31), 1); + expr_ymd(&e, (2020, 1, 1), 366); + expr_ymd(&e, (2021, 1, 1), 365); + expr_ymd(&e, (2020, 12, 31), 1); + expr_ymd(&e, (2021, 12, 31), 1); } #[test] @@ -460,32 +473,32 @@ mod tests { let e = Expr::Var(Var::YearWeek); for y in 1000..3000 { - expr(&e, NaiveDate::from_ymd(y, 1, 1), 1); - expr(&e, NaiveDate::from_ymd(y, 1, 2), 1); - expr(&e, NaiveDate::from_ymd(y, 1, 3), 1); - expr(&e, NaiveDate::from_ymd(y, 1, 4), 1); - expr(&e, NaiveDate::from_ymd(y, 1, 5), 1); - expr(&e, NaiveDate::from_ymd(y, 1, 6), 1); - expr(&e, NaiveDate::from_ymd(y, 1, 7), 1); - expr(&e, NaiveDate::from_ymd(y, 1, 8), 2); - expr(&e, NaiveDate::from_ymd(y, 1, 9), 2); - expr(&e, NaiveDate::from_ymd(y, 1, 10), 2); - expr(&e, NaiveDate::from_ymd(y, 1, 11), 2); - expr(&e, NaiveDate::from_ymd(y, 1, 12), 2); - expr(&e, NaiveDate::from_ymd(y, 1, 13), 2); - expr(&e, NaiveDate::from_ymd(y, 1, 14), 2); - expr(&e, NaiveDate::from_ymd(y, 1, 15), 3); + expr_ymd(&e, (y, 1, 1), 1); + expr_ymd(&e, (y, 1, 2), 1); + expr_ymd(&e, (y, 1, 3), 1); + expr_ymd(&e, (y, 1, 4), 1); + expr_ymd(&e, (y, 1, 5), 1); + expr_ymd(&e, (y, 1, 6), 1); + expr_ymd(&e, (y, 1, 7), 1); + expr_ymd(&e, (y, 1, 8), 2); + expr_ymd(&e, (y, 1, 9), 2); + expr_ymd(&e, (y, 1, 10), 2); + expr_ymd(&e, (y, 1, 11), 2); + expr_ymd(&e, (y, 1, 12), 2); + expr_ymd(&e, (y, 1, 13), 2); + expr_ymd(&e, (y, 1, 14), 2); + expr_ymd(&e, (y, 1, 15), 3); } - expr(&e, NaiveDate::from_ymd(2020, 12, 28), 52); - expr(&e, NaiveDate::from_ymd(2020, 12, 29), 52); - expr(&e, NaiveDate::from_ymd(2020, 12, 30), 53); - expr(&e, NaiveDate::from_ymd(2020, 12, 31), 53); + expr_ymd(&e, (2020, 12, 28), 52); + expr_ymd(&e, (2020, 12, 29), 52); + expr_ymd(&e, (2020, 12, 30), 53); + expr_ymd(&e, (2020, 12, 31), 53); - expr(&e, NaiveDate::from_ymd(2021, 12, 28), 52); - expr(&e, NaiveDate::from_ymd(2021, 12, 29), 52); - expr(&e, NaiveDate::from_ymd(2021, 12, 30), 52); - expr(&e, NaiveDate::from_ymd(2021, 12, 31), 53); + expr_ymd(&e, (2021, 12, 28), 52); + expr_ymd(&e, (2021, 12, 29), 52); + expr_ymd(&e, (2021, 12, 30), 52); + expr_ymd(&e, (2021, 12, 31), 53); } #[test] @@ -493,32 +506,32 @@ mod tests { let e = Expr::Var(Var::YearWeekReverse); for y in 1000..3000 { - expr(&e, NaiveDate::from_ymd(y, 12, 31), 1); - expr(&e, NaiveDate::from_ymd(y, 12, 30), 1); - expr(&e, NaiveDate::from_ymd(y, 12, 29), 1); - expr(&e, NaiveDate::from_ymd(y, 12, 28), 1); - expr(&e, NaiveDate::from_ymd(y, 12, 27), 1); - expr(&e, NaiveDate::from_ymd(y, 12, 26), 1); - expr(&e, NaiveDate::from_ymd(y, 12, 25), 1); - expr(&e, NaiveDate::from_ymd(y, 12, 24), 2); - expr(&e, NaiveDate::from_ymd(y, 12, 23), 2); - expr(&e, NaiveDate::from_ymd(y, 12, 22), 2); - expr(&e, NaiveDate::from_ymd(y, 12, 21), 2); - expr(&e, NaiveDate::from_ymd(y, 12, 20), 2); - expr(&e, NaiveDate::from_ymd(y, 12, 19), 2); - expr(&e, NaiveDate::from_ymd(y, 12, 18), 2); - expr(&e, NaiveDate::from_ymd(y, 12, 17), 3); + expr_ymd(&e, (y, 12, 31), 1); + expr_ymd(&e, (y, 12, 30), 1); + expr_ymd(&e, (y, 12, 29), 1); + expr_ymd(&e, (y, 12, 28), 1); + expr_ymd(&e, (y, 12, 27), 1); + expr_ymd(&e, (y, 12, 26), 1); + expr_ymd(&e, (y, 12, 25), 1); + expr_ymd(&e, (y, 12, 24), 2); + expr_ymd(&e, (y, 12, 23), 2); + expr_ymd(&e, (y, 12, 22), 2); + expr_ymd(&e, (y, 12, 21), 2); + expr_ymd(&e, (y, 12, 20), 2); + expr_ymd(&e, (y, 12, 19), 2); + expr_ymd(&e, (y, 12, 18), 2); + expr_ymd(&e, (y, 12, 17), 3); } - expr(&e, NaiveDate::from_ymd(2020, 1, 1), 53); - expr(&e, NaiveDate::from_ymd(2020, 1, 2), 53); - expr(&e, NaiveDate::from_ymd(2020, 1, 3), 52); - expr(&e, NaiveDate::from_ymd(2020, 1, 4), 52); + expr_ymd(&e, (2020, 1, 1), 53); + expr_ymd(&e, (2020, 1, 2), 53); + expr_ymd(&e, (2020, 1, 3), 52); + expr_ymd(&e, (2020, 1, 4), 52); - expr(&e, NaiveDate::from_ymd(2021, 1, 1), 53); - expr(&e, NaiveDate::from_ymd(2021, 1, 2), 52); - expr(&e, NaiveDate::from_ymd(2021, 1, 3), 52); - expr(&e, NaiveDate::from_ymd(2021, 1, 4), 52); + expr_ymd(&e, (2021, 1, 1), 53); + expr_ymd(&e, (2021, 1, 2), 52); + expr_ymd(&e, (2021, 1, 3), 52); + expr_ymd(&e, (2021, 1, 4), 52); } #[test] @@ -526,7 +539,7 @@ mod tests { let e = Expr::Var(Var::Month); for y in -1000..=3000 { for m in 1..=12 { - expr(&e, NaiveDate::from_ymd(y, m, 13), m.into()); + expr_ymd(&e, (y, m, 13), m.into()); } } } @@ -535,96 +548,96 @@ mod tests { fn month_length() { let e = Expr::Var(Var::MonthLength); - expr(&e, NaiveDate::from_ymd(2021, 1, 5), 31); - expr(&e, NaiveDate::from_ymd(2021, 2, 5), 28); - expr(&e, NaiveDate::from_ymd(2021, 3, 5), 31); - expr(&e, NaiveDate::from_ymd(2021, 4, 5), 30); - expr(&e, NaiveDate::from_ymd(2021, 5, 5), 31); - expr(&e, NaiveDate::from_ymd(2021, 6, 5), 30); - expr(&e, NaiveDate::from_ymd(2021, 7, 5), 31); - expr(&e, NaiveDate::from_ymd(2021, 8, 5), 31); - expr(&e, NaiveDate::from_ymd(2021, 9, 5), 30); - expr(&e, NaiveDate::from_ymd(2021, 10, 5), 31); - expr(&e, NaiveDate::from_ymd(2021, 11, 5), 30); - expr(&e, NaiveDate::from_ymd(2021, 12, 5), 31); + expr_ymd(&e, (2021, 1, 5), 31); + expr_ymd(&e, (2021, 2, 5), 28); + expr_ymd(&e, (2021, 3, 5), 31); + expr_ymd(&e, (2021, 4, 5), 30); + expr_ymd(&e, (2021, 5, 5), 31); + expr_ymd(&e, (2021, 6, 5), 30); + expr_ymd(&e, (2021, 7, 5), 31); + expr_ymd(&e, (2021, 8, 5), 31); + expr_ymd(&e, (2021, 9, 5), 30); + expr_ymd(&e, (2021, 10, 5), 31); + expr_ymd(&e, (2021, 11, 5), 30); + expr_ymd(&e, (2021, 12, 5), 31); - expr(&e, NaiveDate::from_ymd(2020, 2, 5), 29); - expr(&e, NaiveDate::from_ymd(2019, 2, 5), 28); - expr(&e, NaiveDate::from_ymd(2000, 2, 5), 29); + expr_ymd(&e, (2020, 2, 5), 29); + expr_ymd(&e, (2019, 2, 5), 28); + expr_ymd(&e, (2000, 2, 5), 29); } #[test] fn month_week() { let e = Expr::Var(Var::MonthWeek); - expr(&e, NaiveDate::from_ymd(2021, 12, 1), 1); - expr(&e, NaiveDate::from_ymd(2021, 12, 2), 1); - expr(&e, NaiveDate::from_ymd(2021, 12, 3), 1); - expr(&e, NaiveDate::from_ymd(2021, 12, 4), 1); - expr(&e, NaiveDate::from_ymd(2021, 12, 5), 1); - expr(&e, NaiveDate::from_ymd(2021, 12, 6), 1); - expr(&e, NaiveDate::from_ymd(2021, 12, 7), 1); - expr(&e, NaiveDate::from_ymd(2021, 12, 8), 2); - expr(&e, NaiveDate::from_ymd(2021, 12, 9), 2); - expr(&e, NaiveDate::from_ymd(2021, 12, 10), 2); - expr(&e, NaiveDate::from_ymd(2021, 12, 11), 2); - expr(&e, NaiveDate::from_ymd(2021, 12, 12), 2); - expr(&e, NaiveDate::from_ymd(2021, 12, 13), 2); - expr(&e, NaiveDate::from_ymd(2021, 12, 14), 2); - expr(&e, NaiveDate::from_ymd(2021, 12, 15), 3); - expr(&e, NaiveDate::from_ymd(2021, 12, 16), 3); - expr(&e, NaiveDate::from_ymd(2021, 12, 17), 3); - expr(&e, NaiveDate::from_ymd(2021, 12, 18), 3); - expr(&e, NaiveDate::from_ymd(2021, 12, 19), 3); - expr(&e, NaiveDate::from_ymd(2021, 12, 20), 3); - expr(&e, NaiveDate::from_ymd(2021, 12, 21), 3); - expr(&e, NaiveDate::from_ymd(2021, 12, 22), 4); - expr(&e, NaiveDate::from_ymd(2021, 12, 23), 4); - expr(&e, NaiveDate::from_ymd(2021, 12, 24), 4); - expr(&e, NaiveDate::from_ymd(2021, 12, 25), 4); - expr(&e, NaiveDate::from_ymd(2021, 12, 26), 4); - expr(&e, NaiveDate::from_ymd(2021, 12, 27), 4); - expr(&e, NaiveDate::from_ymd(2021, 12, 28), 4); - expr(&e, NaiveDate::from_ymd(2021, 12, 29), 5); - expr(&e, NaiveDate::from_ymd(2021, 12, 30), 5); - expr(&e, NaiveDate::from_ymd(2021, 12, 31), 5); + expr_ymd(&e, (2021, 12, 1), 1); + expr_ymd(&e, (2021, 12, 2), 1); + expr_ymd(&e, (2021, 12, 3), 1); + expr_ymd(&e, (2021, 12, 4), 1); + expr_ymd(&e, (2021, 12, 5), 1); + expr_ymd(&e, (2021, 12, 6), 1); + expr_ymd(&e, (2021, 12, 7), 1); + expr_ymd(&e, (2021, 12, 8), 2); + expr_ymd(&e, (2021, 12, 9), 2); + expr_ymd(&e, (2021, 12, 10), 2); + expr_ymd(&e, (2021, 12, 11), 2); + expr_ymd(&e, (2021, 12, 12), 2); + expr_ymd(&e, (2021, 12, 13), 2); + expr_ymd(&e, (2021, 12, 14), 2); + expr_ymd(&e, (2021, 12, 15), 3); + expr_ymd(&e, (2021, 12, 16), 3); + expr_ymd(&e, (2021, 12, 17), 3); + expr_ymd(&e, (2021, 12, 18), 3); + expr_ymd(&e, (2021, 12, 19), 3); + expr_ymd(&e, (2021, 12, 20), 3); + expr_ymd(&e, (2021, 12, 21), 3); + expr_ymd(&e, (2021, 12, 22), 4); + expr_ymd(&e, (2021, 12, 23), 4); + expr_ymd(&e, (2021, 12, 24), 4); + expr_ymd(&e, (2021, 12, 25), 4); + expr_ymd(&e, (2021, 12, 26), 4); + expr_ymd(&e, (2021, 12, 27), 4); + expr_ymd(&e, (2021, 12, 28), 4); + expr_ymd(&e, (2021, 12, 29), 5); + expr_ymd(&e, (2021, 12, 30), 5); + expr_ymd(&e, (2021, 12, 31), 5); } #[test] fn month_week_reverse() { let e = Expr::Var(Var::MonthWeekReverse); - expr(&e, NaiveDate::from_ymd(2021, 12, 1), 5); - expr(&e, NaiveDate::from_ymd(2021, 12, 2), 5); - expr(&e, NaiveDate::from_ymd(2021, 12, 3), 5); - expr(&e, NaiveDate::from_ymd(2021, 12, 4), 4); - expr(&e, NaiveDate::from_ymd(2021, 12, 5), 4); - expr(&e, NaiveDate::from_ymd(2021, 12, 6), 4); - expr(&e, NaiveDate::from_ymd(2021, 12, 7), 4); - expr(&e, NaiveDate::from_ymd(2021, 12, 8), 4); - expr(&e, NaiveDate::from_ymd(2021, 12, 9), 4); - expr(&e, NaiveDate::from_ymd(2021, 12, 10), 4); - expr(&e, NaiveDate::from_ymd(2021, 12, 11), 3); - expr(&e, NaiveDate::from_ymd(2021, 12, 12), 3); - expr(&e, NaiveDate::from_ymd(2021, 12, 13), 3); - expr(&e, NaiveDate::from_ymd(2021, 12, 14), 3); - expr(&e, NaiveDate::from_ymd(2021, 12, 15), 3); - expr(&e, NaiveDate::from_ymd(2021, 12, 16), 3); - expr(&e, NaiveDate::from_ymd(2021, 12, 17), 3); - expr(&e, NaiveDate::from_ymd(2021, 12, 18), 2); - expr(&e, NaiveDate::from_ymd(2021, 12, 19), 2); - expr(&e, NaiveDate::from_ymd(2021, 12, 20), 2); - expr(&e, NaiveDate::from_ymd(2021, 12, 21), 2); - expr(&e, NaiveDate::from_ymd(2021, 12, 22), 2); - expr(&e, NaiveDate::from_ymd(2021, 12, 23), 2); - expr(&e, NaiveDate::from_ymd(2021, 12, 24), 2); - expr(&e, NaiveDate::from_ymd(2021, 12, 25), 1); - expr(&e, NaiveDate::from_ymd(2021, 12, 26), 1); - expr(&e, NaiveDate::from_ymd(2021, 12, 27), 1); - expr(&e, NaiveDate::from_ymd(2021, 12, 28), 1); - expr(&e, NaiveDate::from_ymd(2021, 12, 29), 1); - expr(&e, NaiveDate::from_ymd(2021, 12, 30), 1); - expr(&e, NaiveDate::from_ymd(2021, 12, 31), 1); + expr_ymd(&e, (2021, 12, 1), 5); + expr_ymd(&e, (2021, 12, 2), 5); + expr_ymd(&e, (2021, 12, 3), 5); + expr_ymd(&e, (2021, 12, 4), 4); + expr_ymd(&e, (2021, 12, 5), 4); + expr_ymd(&e, (2021, 12, 6), 4); + expr_ymd(&e, (2021, 12, 7), 4); + expr_ymd(&e, (2021, 12, 8), 4); + expr_ymd(&e, (2021, 12, 9), 4); + expr_ymd(&e, (2021, 12, 10), 4); + expr_ymd(&e, (2021, 12, 11), 3); + expr_ymd(&e, (2021, 12, 12), 3); + expr_ymd(&e, (2021, 12, 13), 3); + expr_ymd(&e, (2021, 12, 14), 3); + expr_ymd(&e, (2021, 12, 15), 3); + expr_ymd(&e, (2021, 12, 16), 3); + expr_ymd(&e, (2021, 12, 17), 3); + expr_ymd(&e, (2021, 12, 18), 2); + expr_ymd(&e, (2021, 12, 19), 2); + expr_ymd(&e, (2021, 12, 20), 2); + expr_ymd(&e, (2021, 12, 21), 2); + expr_ymd(&e, (2021, 12, 22), 2); + expr_ymd(&e, (2021, 12, 23), 2); + expr_ymd(&e, (2021, 12, 24), 2); + expr_ymd(&e, (2021, 12, 25), 1); + expr_ymd(&e, (2021, 12, 26), 1); + expr_ymd(&e, (2021, 12, 27), 1); + expr_ymd(&e, (2021, 12, 28), 1); + expr_ymd(&e, (2021, 12, 29), 1); + expr_ymd(&e, (2021, 12, 30), 1); + expr_ymd(&e, (2021, 12, 31), 1); } #[test] @@ -632,78 +645,78 @@ mod tests { let e = Expr::Var(Var::Day); for d in 1..=31 { - expr(&e, NaiveDate::from_ymd(2020, 1, d), d.into()); - expr(&e, NaiveDate::from_ymd(2020, 3, d), d.into()); - expr(&e, NaiveDate::from_ymd(2020, 5, d), d.into()); - expr(&e, NaiveDate::from_ymd(2020, 7, d), d.into()); - expr(&e, NaiveDate::from_ymd(2020, 8, d), d.into()); - expr(&e, NaiveDate::from_ymd(2020, 10, d), d.into()); - expr(&e, NaiveDate::from_ymd(2020, 12, d), d.into()); + expr_ymd(&e, (2020, 1, d), d.into()); + expr_ymd(&e, (2020, 3, d), d.into()); + expr_ymd(&e, (2020, 5, d), d.into()); + expr_ymd(&e, (2020, 7, d), d.into()); + expr_ymd(&e, (2020, 8, d), d.into()); + expr_ymd(&e, (2020, 10, d), d.into()); + expr_ymd(&e, (2020, 12, d), d.into()); - expr(&e, NaiveDate::from_ymd(2021, 1, d), d.into()); - expr(&e, NaiveDate::from_ymd(2021, 3, d), d.into()); - expr(&e, NaiveDate::from_ymd(2021, 5, d), d.into()); - expr(&e, NaiveDate::from_ymd(2021, 7, d), d.into()); - expr(&e, NaiveDate::from_ymd(2021, 8, d), d.into()); - expr(&e, NaiveDate::from_ymd(2021, 10, d), d.into()); - expr(&e, NaiveDate::from_ymd(2021, 12, d), d.into()); + expr_ymd(&e, (2021, 1, d), d.into()); + expr_ymd(&e, (2021, 3, d), d.into()); + expr_ymd(&e, (2021, 5, d), d.into()); + expr_ymd(&e, (2021, 7, d), d.into()); + expr_ymd(&e, (2021, 8, d), d.into()); + expr_ymd(&e, (2021, 10, d), d.into()); + expr_ymd(&e, (2021, 12, d), d.into()); } for d in 1..=30 { - expr(&e, NaiveDate::from_ymd(2020, 4, d), d.into()); - expr(&e, NaiveDate::from_ymd(2020, 6, d), d.into()); - expr(&e, NaiveDate::from_ymd(2020, 9, d), d.into()); - expr(&e, NaiveDate::from_ymd(2020, 11, d), d.into()); + expr_ymd(&e, (2020, 4, d), d.into()); + expr_ymd(&e, (2020, 6, d), d.into()); + expr_ymd(&e, (2020, 9, d), d.into()); + expr_ymd(&e, (2020, 11, d), d.into()); - expr(&e, NaiveDate::from_ymd(2021, 4, d), d.into()); - expr(&e, NaiveDate::from_ymd(2021, 6, d), d.into()); - expr(&e, NaiveDate::from_ymd(2021, 9, d), d.into()); - expr(&e, NaiveDate::from_ymd(2021, 11, d), d.into()); + expr_ymd(&e, (2021, 4, d), d.into()); + expr_ymd(&e, (2021, 6, d), d.into()); + expr_ymd(&e, (2021, 9, d), d.into()); + expr_ymd(&e, (2021, 11, d), d.into()); } for d in 1..=28 { - expr(&e, NaiveDate::from_ymd(2020, 2, d), d.into()); - expr(&e, NaiveDate::from_ymd(2021, 2, d), d.into()); + expr_ymd(&e, (2020, 2, d), d.into()); + expr_ymd(&e, (2021, 2, d), d.into()); } - expr(&e, NaiveDate::from_ymd(2020, 2, 29), 29); + expr_ymd(&e, (2020, 2, 29), 29); } #[test] fn day_reverse() { let e = Expr::Var(Var::DayReverse); - expr(&e, NaiveDate::from_ymd(2021, 12, 1), 31); - expr(&e, NaiveDate::from_ymd(2021, 12, 2), 30); - expr(&e, NaiveDate::from_ymd(2021, 12, 3), 29); - expr(&e, NaiveDate::from_ymd(2021, 12, 4), 28); - expr(&e, NaiveDate::from_ymd(2021, 12, 5), 27); - expr(&e, NaiveDate::from_ymd(2021, 12, 6), 26); - expr(&e, NaiveDate::from_ymd(2021, 12, 7), 25); - expr(&e, NaiveDate::from_ymd(2021, 12, 8), 24); - expr(&e, NaiveDate::from_ymd(2021, 12, 9), 23); - expr(&e, NaiveDate::from_ymd(2021, 12, 10), 22); - expr(&e, NaiveDate::from_ymd(2021, 12, 11), 21); - expr(&e, NaiveDate::from_ymd(2021, 12, 12), 20); - expr(&e, NaiveDate::from_ymd(2021, 12, 13), 19); - expr(&e, NaiveDate::from_ymd(2021, 12, 14), 18); - expr(&e, NaiveDate::from_ymd(2021, 12, 15), 17); - expr(&e, NaiveDate::from_ymd(2021, 12, 16), 16); - expr(&e, NaiveDate::from_ymd(2021, 12, 17), 15); - expr(&e, NaiveDate::from_ymd(2021, 12, 18), 14); - expr(&e, NaiveDate::from_ymd(2021, 12, 19), 13); - expr(&e, NaiveDate::from_ymd(2021, 12, 20), 12); - expr(&e, NaiveDate::from_ymd(2021, 12, 21), 11); - expr(&e, NaiveDate::from_ymd(2021, 12, 22), 10); - expr(&e, NaiveDate::from_ymd(2021, 12, 23), 9); - expr(&e, NaiveDate::from_ymd(2021, 12, 24), 8); - expr(&e, NaiveDate::from_ymd(2021, 12, 25), 7); - expr(&e, NaiveDate::from_ymd(2021, 12, 26), 6); - expr(&e, NaiveDate::from_ymd(2021, 12, 27), 5); - expr(&e, NaiveDate::from_ymd(2021, 12, 28), 4); - expr(&e, NaiveDate::from_ymd(2021, 12, 29), 3); - expr(&e, NaiveDate::from_ymd(2021, 12, 30), 2); - expr(&e, NaiveDate::from_ymd(2021, 12, 31), 1); + expr_ymd(&e, (2021, 12, 1), 31); + expr_ymd(&e, (2021, 12, 2), 30); + expr_ymd(&e, (2021, 12, 3), 29); + expr_ymd(&e, (2021, 12, 4), 28); + expr_ymd(&e, (2021, 12, 5), 27); + expr_ymd(&e, (2021, 12, 6), 26); + expr_ymd(&e, (2021, 12, 7), 25); + expr_ymd(&e, (2021, 12, 8), 24); + expr_ymd(&e, (2021, 12, 9), 23); + expr_ymd(&e, (2021, 12, 10), 22); + expr_ymd(&e, (2021, 12, 11), 21); + expr_ymd(&e, (2021, 12, 12), 20); + expr_ymd(&e, (2021, 12, 13), 19); + expr_ymd(&e, (2021, 12, 14), 18); + expr_ymd(&e, (2021, 12, 15), 17); + expr_ymd(&e, (2021, 12, 16), 16); + expr_ymd(&e, (2021, 12, 17), 15); + expr_ymd(&e, (2021, 12, 18), 14); + expr_ymd(&e, (2021, 12, 19), 13); + expr_ymd(&e, (2021, 12, 20), 12); + expr_ymd(&e, (2021, 12, 21), 11); + expr_ymd(&e, (2021, 12, 22), 10); + expr_ymd(&e, (2021, 12, 23), 9); + expr_ymd(&e, (2021, 12, 24), 8); + expr_ymd(&e, (2021, 12, 25), 7); + expr_ymd(&e, (2021, 12, 26), 6); + expr_ymd(&e, (2021, 12, 27), 5); + expr_ymd(&e, (2021, 12, 28), 4); + expr_ymd(&e, (2021, 12, 29), 3); + expr_ymd(&e, (2021, 12, 30), 2); + expr_ymd(&e, (2021, 12, 31), 1); } #[test] @@ -712,32 +725,32 @@ mod tests { // From https://en.wikipedia.org/wiki/ISO_week_date - expr(&e, NaiveDate::from_ymd(1977, 1, 1), 1976); - expr(&e, NaiveDate::from_ymd(1977, 1, 2), 1976); - expr(&e, NaiveDate::from_ymd(1977, 1, 3), 1977); + expr_ymd(&e, (1977, 1, 1), 1976); + expr_ymd(&e, (1977, 1, 2), 1976); + expr_ymd(&e, (1977, 1, 3), 1977); - expr(&e, NaiveDate::from_ymd(1977, 12, 31), 1977); - expr(&e, NaiveDate::from_ymd(1978, 1, 1), 1977); - expr(&e, NaiveDate::from_ymd(1978, 1, 2), 1978); + expr_ymd(&e, (1977, 12, 31), 1977); + expr_ymd(&e, (1978, 1, 1), 1977); + expr_ymd(&e, (1978, 1, 2), 1978); - expr(&e, NaiveDate::from_ymd(1978, 12, 31), 1978); - expr(&e, NaiveDate::from_ymd(1979, 1, 1), 1979); + expr_ymd(&e, (1978, 12, 31), 1978); + expr_ymd(&e, (1979, 1, 1), 1979); - expr(&e, NaiveDate::from_ymd(1979, 12, 30), 1979); - expr(&e, NaiveDate::from_ymd(1979, 12, 31), 1980); - expr(&e, NaiveDate::from_ymd(1980, 1, 1), 1980); + expr_ymd(&e, (1979, 12, 30), 1979); + expr_ymd(&e, (1979, 12, 31), 1980); + expr_ymd(&e, (1980, 1, 1), 1980); - expr(&e, NaiveDate::from_ymd(1980, 12, 28), 1980); - expr(&e, NaiveDate::from_ymd(1980, 12, 29), 1981); - expr(&e, NaiveDate::from_ymd(1980, 12, 30), 1981); - expr(&e, NaiveDate::from_ymd(1980, 12, 31), 1981); - expr(&e, NaiveDate::from_ymd(1981, 1, 1), 1981); + expr_ymd(&e, (1980, 12, 28), 1980); + expr_ymd(&e, (1980, 12, 29), 1981); + expr_ymd(&e, (1980, 12, 30), 1981); + expr_ymd(&e, (1980, 12, 31), 1981); + expr_ymd(&e, (1981, 1, 1), 1981); - expr(&e, NaiveDate::from_ymd(1981, 12, 31), 1981); - expr(&e, NaiveDate::from_ymd(1982, 1, 1), 1981); - expr(&e, NaiveDate::from_ymd(1982, 1, 2), 1981); - expr(&e, NaiveDate::from_ymd(1982, 1, 3), 1981); - expr(&e, NaiveDate::from_ymd(1982, 1, 4), 1982); + expr_ymd(&e, (1981, 12, 31), 1981); + expr_ymd(&e, (1982, 1, 1), 1981); + expr_ymd(&e, (1982, 1, 2), 1981); + expr_ymd(&e, (1982, 1, 3), 1981); + expr_ymd(&e, (1982, 1, 4), 1982); } #[test] @@ -745,37 +758,37 @@ mod tests { let e = Expr::Var(Var::IsoYearLength); // August 1st is definitely in the same year in both systems - expr(&e, NaiveDate::from_ymd(2000, 8, 1), 52 * 7); - expr(&e, NaiveDate::from_ymd(2001, 8, 1), 52 * 7); - expr(&e, NaiveDate::from_ymd(2002, 8, 1), 52 * 7); - expr(&e, NaiveDate::from_ymd(2003, 8, 1), 52 * 7); - expr(&e, NaiveDate::from_ymd(2004, 8, 1), 52 * 7 + 7); - expr(&e, NaiveDate::from_ymd(2005, 8, 1), 52 * 7); - expr(&e, NaiveDate::from_ymd(2006, 8, 1), 52 * 7); - expr(&e, NaiveDate::from_ymd(2007, 8, 1), 52 * 7); - expr(&e, NaiveDate::from_ymd(2008, 8, 1), 52 * 7); - expr(&e, NaiveDate::from_ymd(2009, 8, 1), 52 * 7 + 7); - expr(&e, NaiveDate::from_ymd(2010, 8, 1), 52 * 7); - expr(&e, NaiveDate::from_ymd(2011, 8, 1), 52 * 7); - expr(&e, NaiveDate::from_ymd(2012, 8, 1), 52 * 7); - expr(&e, NaiveDate::from_ymd(2013, 8, 1), 52 * 7); - expr(&e, NaiveDate::from_ymd(2014, 8, 1), 52 * 7); - expr(&e, NaiveDate::from_ymd(2015, 8, 1), 52 * 7 + 7); - expr(&e, NaiveDate::from_ymd(2016, 8, 1), 52 * 7); - expr(&e, NaiveDate::from_ymd(2017, 8, 1), 52 * 7); - expr(&e, NaiveDate::from_ymd(2018, 8, 1), 52 * 7); - expr(&e, NaiveDate::from_ymd(2019, 8, 1), 52 * 7); - expr(&e, NaiveDate::from_ymd(2020, 8, 1), 52 * 7 + 7); - expr(&e, NaiveDate::from_ymd(2021, 8, 1), 52 * 7); - expr(&e, NaiveDate::from_ymd(2022, 8, 1), 52 * 7); - expr(&e, NaiveDate::from_ymd(2023, 8, 1), 52 * 7); - expr(&e, NaiveDate::from_ymd(2024, 8, 1), 52 * 7); - expr(&e, NaiveDate::from_ymd(2025, 8, 1), 52 * 7); - expr(&e, NaiveDate::from_ymd(2026, 8, 1), 52 * 7 + 7); - expr(&e, NaiveDate::from_ymd(2027, 8, 1), 52 * 7); - expr(&e, NaiveDate::from_ymd(2028, 8, 1), 52 * 7); - expr(&e, NaiveDate::from_ymd(2029, 8, 1), 52 * 7); - expr(&e, NaiveDate::from_ymd(2030, 8, 1), 52 * 7); + expr_ymd(&e, (2000, 8, 1), 52 * 7); + expr_ymd(&e, (2001, 8, 1), 52 * 7); + expr_ymd(&e, (2002, 8, 1), 52 * 7); + expr_ymd(&e, (2003, 8, 1), 52 * 7); + expr_ymd(&e, (2004, 8, 1), 52 * 7 + 7); + expr_ymd(&e, (2005, 8, 1), 52 * 7); + expr_ymd(&e, (2006, 8, 1), 52 * 7); + expr_ymd(&e, (2007, 8, 1), 52 * 7); + expr_ymd(&e, (2008, 8, 1), 52 * 7); + expr_ymd(&e, (2009, 8, 1), 52 * 7 + 7); + expr_ymd(&e, (2010, 8, 1), 52 * 7); + expr_ymd(&e, (2011, 8, 1), 52 * 7); + expr_ymd(&e, (2012, 8, 1), 52 * 7); + expr_ymd(&e, (2013, 8, 1), 52 * 7); + expr_ymd(&e, (2014, 8, 1), 52 * 7); + expr_ymd(&e, (2015, 8, 1), 52 * 7 + 7); + expr_ymd(&e, (2016, 8, 1), 52 * 7); + expr_ymd(&e, (2017, 8, 1), 52 * 7); + expr_ymd(&e, (2018, 8, 1), 52 * 7); + expr_ymd(&e, (2019, 8, 1), 52 * 7); + expr_ymd(&e, (2020, 8, 1), 52 * 7 + 7); + expr_ymd(&e, (2021, 8, 1), 52 * 7); + expr_ymd(&e, (2022, 8, 1), 52 * 7); + expr_ymd(&e, (2023, 8, 1), 52 * 7); + expr_ymd(&e, (2024, 8, 1), 52 * 7); + expr_ymd(&e, (2025, 8, 1), 52 * 7); + expr_ymd(&e, (2026, 8, 1), 52 * 7 + 7); + expr_ymd(&e, (2027, 8, 1), 52 * 7); + expr_ymd(&e, (2028, 8, 1), 52 * 7); + expr_ymd(&e, (2029, 8, 1), 52 * 7); + expr_ymd(&e, (2030, 8, 1), 52 * 7); } #[test] @@ -784,52 +797,52 @@ mod tests { // From https://en.wikipedia.org/wiki/ISO_week_date - expr(&e, NaiveDate::from_ymd(1977, 1, 1), 53); - expr(&e, NaiveDate::from_ymd(1977, 1, 2), 53); - expr(&e, NaiveDate::from_ymd(1977, 1, 3), 1); + expr_ymd(&e, (1977, 1, 1), 53); + expr_ymd(&e, (1977, 1, 2), 53); + expr_ymd(&e, (1977, 1, 3), 1); - expr(&e, NaiveDate::from_ymd(1977, 12, 31), 52); - expr(&e, NaiveDate::from_ymd(1978, 1, 1), 52); - expr(&e, NaiveDate::from_ymd(1978, 1, 2), 1); + expr_ymd(&e, (1977, 12, 31), 52); + expr_ymd(&e, (1978, 1, 1), 52); + expr_ymd(&e, (1978, 1, 2), 1); - expr(&e, NaiveDate::from_ymd(1978, 12, 31), 52); - expr(&e, NaiveDate::from_ymd(1979, 1, 1), 1); + expr_ymd(&e, (1978, 12, 31), 52); + expr_ymd(&e, (1979, 1, 1), 1); - expr(&e, NaiveDate::from_ymd(1979, 12, 30), 52); - expr(&e, NaiveDate::from_ymd(1979, 12, 31), 1); - expr(&e, NaiveDate::from_ymd(1980, 1, 1), 1); + expr_ymd(&e, (1979, 12, 30), 52); + expr_ymd(&e, (1979, 12, 31), 1); + expr_ymd(&e, (1980, 1, 1), 1); - expr(&e, NaiveDate::from_ymd(1980, 12, 28), 52); - expr(&e, NaiveDate::from_ymd(1980, 12, 29), 1); - expr(&e, NaiveDate::from_ymd(1980, 12, 30), 1); - expr(&e, NaiveDate::from_ymd(1980, 12, 31), 1); - expr(&e, NaiveDate::from_ymd(1981, 1, 1), 1); + expr_ymd(&e, (1980, 12, 28), 52); + expr_ymd(&e, (1980, 12, 29), 1); + expr_ymd(&e, (1980, 12, 30), 1); + expr_ymd(&e, (1980, 12, 31), 1); + expr_ymd(&e, (1981, 1, 1), 1); - expr(&e, NaiveDate::from_ymd(1981, 12, 31), 53); - expr(&e, NaiveDate::from_ymd(1982, 1, 1), 53); - expr(&e, NaiveDate::from_ymd(1982, 1, 2), 53); - expr(&e, NaiveDate::from_ymd(1982, 1, 3), 53); - expr(&e, NaiveDate::from_ymd(1982, 1, 4), 1); + expr_ymd(&e, (1981, 12, 31), 53); + expr_ymd(&e, (1982, 1, 1), 53); + expr_ymd(&e, (1982, 1, 2), 53); + expr_ymd(&e, (1982, 1, 3), 53); + expr_ymd(&e, (1982, 1, 4), 1); } #[test] fn weekday() { let e = Expr::Var(Var::Weekday); - expr(&e, NaiveDate::from_ymd(2021, 12, 18), 6); - expr(&e, NaiveDate::from_ymd(2021, 12, 19), 7); - expr(&e, NaiveDate::from_ymd(2021, 12, 20), 1); - expr(&e, NaiveDate::from_ymd(2021, 12, 21), 2); - expr(&e, NaiveDate::from_ymd(2021, 12, 22), 3); - expr(&e, NaiveDate::from_ymd(2021, 12, 23), 4); - expr(&e, NaiveDate::from_ymd(2021, 12, 24), 5); - expr(&e, NaiveDate::from_ymd(2021, 12, 25), 6); - expr(&e, NaiveDate::from_ymd(2021, 12, 26), 7); - expr(&e, NaiveDate::from_ymd(2021, 12, 27), 1); - expr(&e, NaiveDate::from_ymd(2021, 12, 28), 2); - expr(&e, NaiveDate::from_ymd(2021, 12, 29), 3); - expr(&e, NaiveDate::from_ymd(2021, 12, 30), 4); - expr(&e, NaiveDate::from_ymd(2021, 12, 31), 5); + expr_ymd(&e, (2021, 12, 18), 6); + expr_ymd(&e, (2021, 12, 19), 7); + expr_ymd(&e, (2021, 12, 20), 1); + expr_ymd(&e, (2021, 12, 21), 2); + expr_ymd(&e, (2021, 12, 22), 3); + expr_ymd(&e, (2021, 12, 23), 4); + expr_ymd(&e, (2021, 12, 24), 5); + expr_ymd(&e, (2021, 12, 25), 6); + expr_ymd(&e, (2021, 12, 26), 7); + expr_ymd(&e, (2021, 12, 27), 1); + expr_ymd(&e, (2021, 12, 28), 2); + expr_ymd(&e, (2021, 12, 29), 3); + expr_ymd(&e, (2021, 12, 30), 4); + expr_ymd(&e, (2021, 12, 31), 5); } #[test] @@ -889,10 +902,10 @@ mod tests { ]; for (y, m, d) in dates { - expr( + expr_ymd( &e, - NaiveDate::from_ymd(y, 1, 1), - NaiveDate::from_ymd(y, m, d).ordinal().into(), + (y, 1, 1), + NaiveDate::from_ymd_opt(y, m, d).unwrap().ordinal().into(), ); } } @@ -901,77 +914,77 @@ mod tests { fn is_weekday() { let e = Expr::Var(Var::IsWeekday); - expr(&e, NaiveDate::from_ymd(2021, 12, 18), 0); - expr(&e, NaiveDate::from_ymd(2021, 12, 19), 0); - expr(&e, NaiveDate::from_ymd(2021, 12, 20), 1); - expr(&e, NaiveDate::from_ymd(2021, 12, 21), 1); - expr(&e, NaiveDate::from_ymd(2021, 12, 22), 1); - expr(&e, NaiveDate::from_ymd(2021, 12, 23), 1); - expr(&e, NaiveDate::from_ymd(2021, 12, 24), 1); - expr(&e, NaiveDate::from_ymd(2021, 12, 25), 0); - expr(&e, NaiveDate::from_ymd(2021, 12, 26), 0); - expr(&e, NaiveDate::from_ymd(2021, 12, 27), 1); - expr(&e, NaiveDate::from_ymd(2021, 12, 28), 1); - expr(&e, NaiveDate::from_ymd(2021, 12, 29), 1); - expr(&e, NaiveDate::from_ymd(2021, 12, 30), 1); - expr(&e, NaiveDate::from_ymd(2021, 12, 31), 1); + expr_ymd(&e, (2021, 12, 18), 0); + expr_ymd(&e, (2021, 12, 19), 0); + expr_ymd(&e, (2021, 12, 20), 1); + expr_ymd(&e, (2021, 12, 21), 1); + expr_ymd(&e, (2021, 12, 22), 1); + expr_ymd(&e, (2021, 12, 23), 1); + expr_ymd(&e, (2021, 12, 24), 1); + expr_ymd(&e, (2021, 12, 25), 0); + expr_ymd(&e, (2021, 12, 26), 0); + expr_ymd(&e, (2021, 12, 27), 1); + expr_ymd(&e, (2021, 12, 28), 1); + expr_ymd(&e, (2021, 12, 29), 1); + expr_ymd(&e, (2021, 12, 30), 1); + expr_ymd(&e, (2021, 12, 31), 1); } #[test] fn is_weekend() { let e = Expr::Var(Var::IsWeekend); - expr(&e, NaiveDate::from_ymd(2021, 12, 18), 1); - expr(&e, NaiveDate::from_ymd(2021, 12, 19), 1); - expr(&e, NaiveDate::from_ymd(2021, 12, 20), 0); - expr(&e, NaiveDate::from_ymd(2021, 12, 21), 0); - expr(&e, NaiveDate::from_ymd(2021, 12, 22), 0); - expr(&e, NaiveDate::from_ymd(2021, 12, 23), 0); - expr(&e, NaiveDate::from_ymd(2021, 12, 24), 0); - expr(&e, NaiveDate::from_ymd(2021, 12, 25), 1); - expr(&e, NaiveDate::from_ymd(2021, 12, 26), 1); - expr(&e, NaiveDate::from_ymd(2021, 12, 27), 0); - expr(&e, NaiveDate::from_ymd(2021, 12, 28), 0); - expr(&e, NaiveDate::from_ymd(2021, 12, 29), 0); - expr(&e, NaiveDate::from_ymd(2021, 12, 30), 0); - expr(&e, NaiveDate::from_ymd(2021, 12, 31), 0); + expr_ymd(&e, (2021, 12, 18), 1); + expr_ymd(&e, (2021, 12, 19), 1); + expr_ymd(&e, (2021, 12, 20), 0); + expr_ymd(&e, (2021, 12, 21), 0); + expr_ymd(&e, (2021, 12, 22), 0); + expr_ymd(&e, (2021, 12, 23), 0); + expr_ymd(&e, (2021, 12, 24), 0); + expr_ymd(&e, (2021, 12, 25), 1); + expr_ymd(&e, (2021, 12, 26), 1); + expr_ymd(&e, (2021, 12, 27), 0); + expr_ymd(&e, (2021, 12, 28), 0); + expr_ymd(&e, (2021, 12, 29), 0); + expr_ymd(&e, (2021, 12, 30), 0); + expr_ymd(&e, (2021, 12, 31), 0); } #[test] fn is_leap_year() { let e = Expr::Var(Var::IsLeapYear); - expr(&e, NaiveDate::from_ymd(2000, 1, 1), 1); - expr(&e, NaiveDate::from_ymd(2001, 1, 1), 0); - expr(&e, NaiveDate::from_ymd(2002, 1, 1), 0); - expr(&e, NaiveDate::from_ymd(2003, 1, 1), 0); - expr(&e, NaiveDate::from_ymd(2004, 1, 1), 1); - expr(&e, NaiveDate::from_ymd(2005, 1, 1), 0); - expr(&e, NaiveDate::from_ymd(2006, 1, 1), 0); - expr(&e, NaiveDate::from_ymd(2007, 1, 1), 0); - expr(&e, NaiveDate::from_ymd(2008, 1, 1), 1); - expr(&e, NaiveDate::from_ymd(2009, 1, 1), 0); - expr(&e, NaiveDate::from_ymd(2010, 1, 1), 0); - expr(&e, NaiveDate::from_ymd(2011, 1, 1), 0); - expr(&e, NaiveDate::from_ymd(2012, 1, 1), 1); - expr(&e, NaiveDate::from_ymd(2013, 1, 1), 0); - expr(&e, NaiveDate::from_ymd(2014, 1, 1), 0); - expr(&e, NaiveDate::from_ymd(2015, 1, 1), 0); - expr(&e, NaiveDate::from_ymd(2016, 1, 1), 1); - expr(&e, NaiveDate::from_ymd(2017, 1, 1), 0); - expr(&e, NaiveDate::from_ymd(2018, 1, 1), 0); - expr(&e, NaiveDate::from_ymd(2019, 1, 1), 0); - expr(&e, NaiveDate::from_ymd(2020, 1, 1), 1); - expr(&e, NaiveDate::from_ymd(2021, 1, 1), 0); - expr(&e, NaiveDate::from_ymd(2022, 1, 1), 0); - expr(&e, NaiveDate::from_ymd(2023, 1, 1), 0); - expr(&e, NaiveDate::from_ymd(2024, 1, 1), 1); - expr(&e, NaiveDate::from_ymd(2025, 1, 1), 0); - expr(&e, NaiveDate::from_ymd(2026, 1, 1), 0); - expr(&e, NaiveDate::from_ymd(2027, 1, 1), 0); - expr(&e, NaiveDate::from_ymd(2028, 1, 1), 1); - expr(&e, NaiveDate::from_ymd(2029, 1, 1), 0); - expr(&e, NaiveDate::from_ymd(2030, 1, 1), 0); + expr_ymd(&e, (2000, 1, 1), 1); + expr_ymd(&e, (2001, 1, 1), 0); + expr_ymd(&e, (2002, 1, 1), 0); + expr_ymd(&e, (2003, 1, 1), 0); + expr_ymd(&e, (2004, 1, 1), 1); + expr_ymd(&e, (2005, 1, 1), 0); + expr_ymd(&e, (2006, 1, 1), 0); + expr_ymd(&e, (2007, 1, 1), 0); + expr_ymd(&e, (2008, 1, 1), 1); + expr_ymd(&e, (2009, 1, 1), 0); + expr_ymd(&e, (2010, 1, 1), 0); + expr_ymd(&e, (2011, 1, 1), 0); + expr_ymd(&e, (2012, 1, 1), 1); + expr_ymd(&e, (2013, 1, 1), 0); + expr_ymd(&e, (2014, 1, 1), 0); + expr_ymd(&e, (2015, 1, 1), 0); + expr_ymd(&e, (2016, 1, 1), 1); + expr_ymd(&e, (2017, 1, 1), 0); + expr_ymd(&e, (2018, 1, 1), 0); + expr_ymd(&e, (2019, 1, 1), 0); + expr_ymd(&e, (2020, 1, 1), 1); + expr_ymd(&e, (2021, 1, 1), 0); + expr_ymd(&e, (2022, 1, 1), 0); + expr_ymd(&e, (2023, 1, 1), 0); + expr_ymd(&e, (2024, 1, 1), 1); + expr_ymd(&e, (2025, 1, 1), 0); + expr_ymd(&e, (2026, 1, 1), 0); + expr_ymd(&e, (2027, 1, 1), 0); + expr_ymd(&e, (2028, 1, 1), 1); + expr_ymd(&e, (2029, 1, 1), 0); + expr_ymd(&e, (2030, 1, 1), 0); } #[test] @@ -979,36 +992,36 @@ mod tests { let e = Expr::Var(Var::IsIsoLeapYear); // August 1st is definitely in the same year in both systems - expr(&e, NaiveDate::from_ymd(2000, 8, 1), 0); - expr(&e, NaiveDate::from_ymd(2001, 8, 1), 0); - expr(&e, NaiveDate::from_ymd(2002, 8, 1), 0); - expr(&e, NaiveDate::from_ymd(2003, 8, 1), 0); - expr(&e, NaiveDate::from_ymd(2004, 8, 1), 1); - expr(&e, NaiveDate::from_ymd(2005, 8, 1), 0); - expr(&e, NaiveDate::from_ymd(2006, 8, 1), 0); - expr(&e, NaiveDate::from_ymd(2007, 8, 1), 0); - expr(&e, NaiveDate::from_ymd(2008, 8, 1), 0); - expr(&e, NaiveDate::from_ymd(2009, 8, 1), 1); - expr(&e, NaiveDate::from_ymd(2010, 8, 1), 0); - expr(&e, NaiveDate::from_ymd(2011, 8, 1), 0); - expr(&e, NaiveDate::from_ymd(2012, 8, 1), 0); - expr(&e, NaiveDate::from_ymd(2013, 8, 1), 0); - expr(&e, NaiveDate::from_ymd(2014, 8, 1), 0); - expr(&e, NaiveDate::from_ymd(2015, 8, 1), 1); - expr(&e, NaiveDate::from_ymd(2016, 8, 1), 0); - expr(&e, NaiveDate::from_ymd(2017, 8, 1), 0); - expr(&e, NaiveDate::from_ymd(2018, 8, 1), 0); - expr(&e, NaiveDate::from_ymd(2019, 8, 1), 0); - expr(&e, NaiveDate::from_ymd(2020, 8, 1), 1); - expr(&e, NaiveDate::from_ymd(2021, 8, 1), 0); - expr(&e, NaiveDate::from_ymd(2022, 8, 1), 0); - expr(&e, NaiveDate::from_ymd(2023, 8, 1), 0); - expr(&e, NaiveDate::from_ymd(2024, 8, 1), 0); - expr(&e, NaiveDate::from_ymd(2025, 8, 1), 0); - expr(&e, NaiveDate::from_ymd(2026, 8, 1), 1); - expr(&e, NaiveDate::from_ymd(2027, 8, 1), 0); - expr(&e, NaiveDate::from_ymd(2028, 8, 1), 0); - expr(&e, NaiveDate::from_ymd(2029, 8, 1), 0); - expr(&e, NaiveDate::from_ymd(2030, 8, 1), 0); + expr_ymd(&e, (2000, 8, 1), 0); + expr_ymd(&e, (2001, 8, 1), 0); + expr_ymd(&e, (2002, 8, 1), 0); + expr_ymd(&e, (2003, 8, 1), 0); + expr_ymd(&e, (2004, 8, 1), 1); + expr_ymd(&e, (2005, 8, 1), 0); + expr_ymd(&e, (2006, 8, 1), 0); + expr_ymd(&e, (2007, 8, 1), 0); + expr_ymd(&e, (2008, 8, 1), 0); + expr_ymd(&e, (2009, 8, 1), 1); + expr_ymd(&e, (2010, 8, 1), 0); + expr_ymd(&e, (2011, 8, 1), 0); + expr_ymd(&e, (2012, 8, 1), 0); + expr_ymd(&e, (2013, 8, 1), 0); + expr_ymd(&e, (2014, 8, 1), 0); + expr_ymd(&e, (2015, 8, 1), 1); + expr_ymd(&e, (2016, 8, 1), 0); + expr_ymd(&e, (2017, 8, 1), 0); + expr_ymd(&e, (2018, 8, 1), 0); + expr_ymd(&e, (2019, 8, 1), 0); + expr_ymd(&e, (2020, 8, 1), 1); + expr_ymd(&e, (2021, 8, 1), 0); + expr_ymd(&e, (2022, 8, 1), 0); + expr_ymd(&e, (2023, 8, 1), 0); + expr_ymd(&e, (2024, 8, 1), 0); + expr_ymd(&e, (2025, 8, 1), 0); + expr_ymd(&e, (2026, 8, 1), 1); + expr_ymd(&e, (2027, 8, 1), 0); + expr_ymd(&e, (2028, 8, 1), 0); + expr_ymd(&e, (2029, 8, 1), 0); + expr_ymd(&e, (2030, 8, 1), 0); } } diff --git a/src/eval/delta.rs b/src/eval/delta.rs index f390cf2..b42d8a7 100644 --- a/src/eval/delta.rs +++ b/src/eval/delta.rs @@ -298,7 +298,7 @@ impl DeltaEval { }; if time < curr_time { - self.curr = self.curr.succ(); + self.curr = self.curr.succ_opt().unwrap(); } self.curr_time = Some(time); Ok(()) @@ -359,13 +359,13 @@ mod tests { } fn apply_d(step: Step, from: (i32, u32, u32)) -> Result> { - delta(step).apply_date((), NaiveDate::from_ymd(from.0, from.1, from.2)) + delta(step).apply_date((), NaiveDate::from_ymd_opt(from.0, from.1, from.2).unwrap()) } fn test_d(step: Step, from: (i32, u32, u32), expected: (i32, u32, u32)) { assert_eq!( apply_d(step, from).unwrap(), - NaiveDate::from_ymd(expected.0, expected.1, expected.2) + NaiveDate::from_ymd_opt(expected.0, expected.1, expected.2).unwrap() ); } @@ -375,7 +375,7 @@ mod tests { ) -> Result<(NaiveDate, Time), Error<()>> { delta(step).apply_date_time( (), - NaiveDate::from_ymd(from.0, from.1, from.2), + NaiveDate::from_ymd_opt(from.0, from.1, from.2).unwrap(), Time::new(from.3, from.4), ) } @@ -385,7 +385,7 @@ mod tests { assert_eq!( apply_dt(step, from).unwrap(), ( - NaiveDate::from_ymd(expected.0, expected.1, expected.2), + NaiveDate::from_ymd_opt(expected.0, expected.1, expected.2).unwrap(), Time::new(expected.3, expected.4) ) ); diff --git a/src/eval/range.rs b/src/eval/range.rs index 8a7cef5..88b6ec2 100644 --- a/src/eval/range.rs +++ b/src/eval/range.rs @@ -75,7 +75,7 @@ impl DateRange { pub fn days(&self) -> impl Iterator { (self.from.num_days_from_ce()..=self.until.num_days_from_ce()) - .map(NaiveDate::from_num_days_from_ce) + .map(|days| NaiveDate::from_num_days_from_ce_opt(days).unwrap()) } pub fn years(&self) -> RangeInclusive { diff --git a/src/eval/util.rs b/src/eval/util.rs index 65b6ee4..9b010bc 100644 --- a/src/eval/util.rs +++ b/src/eval/util.rs @@ -9,13 +9,14 @@ pub fn is_iso_leap_year(year: i32) -> bool { } pub fn year_length(year: i32) -> u32 { - NaiveDate::from_ymd(year, 12, 31).ordinal() + NaiveDate::from_ymd_opt(year, 12, 31).unwrap().ordinal() } pub fn month_length(year: i32, month: u32) -> u32 { NaiveDate::from_ymd_opt(year, month + 1, 1) - .unwrap_or_else(|| NaiveDate::from_ymd(year + 1, 1, 1)) - .pred() + .unwrap_or_else(|| NaiveDate::from_ymd_opt(year + 1, 1, 1).unwrap()) + .pred_opt() + .unwrap() .day() } diff --git a/src/files/parse.rs b/src/files/parse.rs index 8ff2eca..067e765 100644 --- a/src/files/parse.rs +++ b/src/files/parse.rs @@ -293,7 +293,7 @@ fn parse_date_fixed(p: Pair<'_, Rule>) -> Result { assert_eq!(p.as_rule(), Rule::date_fixed); let mut spec = DateSpec { - start: NaiveDate::from_ymd(0, 1, 1), + start: NaiveDate::from_ymd_opt(0, 1, 1).unwrap(), start_delta: None, start_time: None, end: None, From cb470d201ee811e409d036c363b533068f6d55d5 Mon Sep 17 00:00:00 2001 From: Joscha Date: Sat, 11 Feb 2023 22:24:15 +0100 Subject: [PATCH 17/20] Update dependencies --- Cargo.lock | 259 +++++++++++++++++++++++++++++++---------------------- Cargo.toml | 10 +-- 2 files changed, 157 insertions(+), 112 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index be2f02f..4836ec3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,7 +17,7 @@ version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" dependencies = [ - "hermit-abi", + "hermit-abi 0.1.19", "libc", "winapi", ] @@ -45,9 +45,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.11.1" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "572f695136211188308f16ad2ca5c851a712c464060ae6974944458eb83880ba" +checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" [[package]] name = "byteorder" @@ -57,9 +57,9 @@ checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "cc" -version = "1.0.74" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581f5dba903aac52ea3feb5ec4810848460ee833876f1f9b0fdeab1f19091574" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" [[package]] name = "cfg-if" @@ -84,14 +84,14 @@ dependencies = [ [[package]] name = "clap" -version = "4.0.18" +version = "4.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335867764ed2de42325fafe6d18b8af74ba97ee0c590fa016f157535b42ab04b" +checksum = "f13b9c79b5d1dd500d20ef541215a6423c75829ef43117e1b4d17fd8af0b5d76" dependencies = [ - "atty", "bitflags", "clap_derive", "clap_lex", + "is-terminal", "once_cell", "strsim", "termcolor", @@ -99,9 +99,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.0.18" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16a1b0f6422af32d5da0c58e2703320f379216ee70198241c84173a8c5ac28f3" +checksum = "684a277d672e91966334af371f1a7b5833f9aa00b07c84e92fbce95e00208ce8" dependencies = [ "heck", "proc-macro-error", @@ -112,18 +112,18 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d4198f73e42b4936b35b5bb248d81d2b595ecb170da0bac7655c54eedfa8da8" +checksum = "783fe232adfca04f90f56201b26d79682d4cd2625e0bc7290b95123afe558ade" dependencies = [ "os_str_bytes", ] [[package]] name = "clipboard-win" -version = "4.4.2" +version = "4.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4ab1b92798304eedc095b53942963240037c0516452cb11aeba709d420b2219" +checksum = "7191c27c2357d9b7ef96baac1773290d4ca63b24205b82a3fd8a0637afcf0362" dependencies = [ "error-code", "str-buf", @@ -184,9 +184,9 @@ dependencies = [ [[package]] name = "cxx" -version = "1.0.80" +version = "1.0.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b7d4e43b25d3c994662706a1d4fcfc32aaa6afd287502c111b237093bb23f3a" +checksum = "90d59d9acd2a682b4e40605a242f6670eaa58c5957471cbf85e8aa6a0b97a5e8" dependencies = [ "cc", "cxxbridge-flags", @@ -196,9 +196,9 @@ dependencies = [ [[package]] name = "cxx-build" -version = "1.0.80" +version = "1.0.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84f8829ddc213e2c1368e51a2564c552b65a8cb6a28f31e576270ac81d5e5827" +checksum = "ebfa40bda659dd5c864e65f4c9a2b0aff19bea56b017b9b77c73d3766a453a38" dependencies = [ "cc", "codespan-reporting", @@ -211,15 +211,15 @@ dependencies = [ [[package]] name = "cxxbridge-flags" -version = "1.0.80" +version = "1.0.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e72537424b474af1460806647c41d4b6d35d09ef7fe031c5c2fa5766047cc56a" +checksum = "457ce6757c5c70dc6ecdbda6925b958aae7f959bda7d8fb9bde889e34a09dc03" [[package]] name = "cxxbridge-macro" -version = "1.0.80" +version = "1.0.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "309e4fb93eed90e1e14bea0da16b209f81813ba9fc7830c20ed151dd7bc0a4d7" +checksum = "ebf883b7aacd7b2aeb2a7b338648ee19f57c140d4ee8e52c68979c6b2f7f2263" dependencies = [ "proc-macro2", "quote", @@ -228,9 +228,9 @@ dependencies = [ [[package]] name = "digest" -version = "0.10.5" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adfbc57365a37acbd2ebf2b64d7e69bb766e2fea813521ed536f5d0520dcf86c" +checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" dependencies = [ "block-buffer", "crypto-common", @@ -289,9 +289,9 @@ dependencies = [ [[package]] name = "either" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" +checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" [[package]] name = "endian-type" @@ -341,9 +341,9 @@ dependencies = [ [[package]] name = "fd-lock" -version = "3.0.6" +version = "3.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e11dcc7e4d79a8c89b9ab4c6f5c30b1fc4a83c420792da3542fd31179ed5f517" +checksum = "8ef1a30ae415c3a691a4f41afddc2dbcd6d70baf338368d85ebc1e8ed92cedb9" dependencies = [ "cfg-if", "rustix", @@ -373,9 +373,9 @@ dependencies = [ [[package]] name = "heck" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "hermit-abi" @@ -386,6 +386,12 @@ dependencies = [ "libc", ] +[[package]] +name = "hermit-abi" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" + [[package]] name = "iana-time-zone" version = "0.1.53" @@ -421,15 +427,31 @@ dependencies = [ [[package]] name = "io-lifetimes" -version = "0.7.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6e481ccbe3dea62107216d0d1138bb8ad8e5e5c43009a098bd1990272c497b0" +checksum = "1abeb7a0dd0f8181267ff8adc397075586500b81b28a73e8a0208b00fc170fb3" +dependencies = [ + "libc", + "windows-sys", +] + +[[package]] +name = "is-terminal" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e18b0a45d56fe973d6db23972bf5bc46f988a4a2385deac9cc29572f09daef" +dependencies = [ + "hermit-abi 0.3.1", + "io-lifetimes", + "rustix", + "windows-sys", +] [[package]] name = "js-sys" -version = "0.3.60" +version = "0.3.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47" +checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" dependencies = [ "wasm-bindgen", ] @@ -442,24 +464,24 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.137" +version = "0.2.139" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7fcc620a3bff7cdd7a365be3376c97191aeaccc2a603e600951e452615bf89" +checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79" [[package]] name = "link-cplusplus" -version = "1.0.7" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9272ab7b96c9046fbc5bc56c06c117cb639fe2d509df0c421cad82d2915cf369" +checksum = "ecd207c9c713c34f95a097a5b029ac2ce6010530c7b49d7fea24d977dede04f5" dependencies = [ "cc", ] [[package]] name = "linux-raw-sys" -version = "0.0.46" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4d2456c373231a208ad294c33dc5bff30051eafd954cd4caae83a712b12854d" +checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4" [[package]] name = "log" @@ -496,9 +518,9 @@ dependencies = [ [[package]] name = "nix" -version = "0.23.1" +version = "0.23.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f866317acbd3a240710c63f065ffb1e4fd466259045ccb504130b7f668f35c6" +checksum = "8f3790c00a0150112de0f4cd161e3d7fc4b2d8a5542ffc35f099a2562aecb35c" dependencies = [ "bitflags", "cc", @@ -528,21 +550,21 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86f0b0d4bf799edbc74508c1e8bf170ff5f41238e5f8225603ca7caaae2b7860" +checksum = "6f61fba1741ea2b3d6a1e3178721804bb716a68a6aeba1149b5d52e3d464ea66" [[package]] name = "os_str_bytes" -version = "6.3.1" +version = "6.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3baf96e39c5359d2eb0dd6ccb42c62b91d9678aa68160d261b9e0ccbf9e9dea9" +checksum = "9b7820b9daea5457c9f21c69448905d723fbd21136ccf521748f23fd49e723ee" [[package]] name = "pest" -version = "2.4.0" +version = "2.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbc7bc69c062e492337d74d59b120c274fd3d261b6bf6d3207d499b4b379c41a" +checksum = "028accff104c4e513bad663bbcd2ad7cfd5304144404c31ed0a77ac103d00660" dependencies = [ "thiserror", "ucd-trie", @@ -550,9 +572,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.4.0" +version = "2.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b75706b9642ebcb34dab3bc7750f811609a0eb1dd8b88c2d15bf628c1c65b2" +checksum = "2ac3922aac69a40733080f53c1ce7f91dcf57e1a5f6c52f421fadec7fbdc4b69" dependencies = [ "pest", "pest_generator", @@ -560,9 +582,9 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.4.0" +version = "2.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f9272122f5979a6511a749af9db9bfc810393f63119970d7085fed1c4ea0db" +checksum = "d06646e185566b5961b4058dd107e0a7f56e77c3f484549fb119867773c0f202" dependencies = [ "pest", "pest_meta", @@ -573,13 +595,13 @@ dependencies = [ [[package]] name = "pest_meta" -version = "2.4.0" +version = "2.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c8717927f9b79515e565a64fe46c38b8cd0427e64c40680b14a7365ab09ac8d" +checksum = "e6f60b2ba541577e2a0c307c8f39d1439108120eb7903adeb6497fa880c59616" dependencies = [ "once_cell", "pest", - "sha1", + "sha2", ] [[package]] @@ -608,9 +630,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.47" +version = "1.0.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ea3d908b0e36316caf9e9e2c4625cdde190a7e6f440d794667ed17a1855e725" +checksum = "5d727cae5b39d21da60fa540906919ad737832fe0b1c165da3a34d6548c849d6" dependencies = [ "unicode-ident", ] @@ -626,9 +648,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.21" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" +checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b" dependencies = [ "proc-macro2", ] @@ -674,9 +696,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.35.12" +version = "0.36.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "985947f9b6423159c4726323f373be0a21bdb514c5af06a849cb3d2dce2d01e8" +checksum = "f43abb88211988493c1abb44a70efa56ff0ce98f233b7b276146f1f3f7ba9644" dependencies = [ "bitflags", "errno", @@ -718,15 +740,15 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "scratch" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8132065adcfd6e02db789d9285a0deb2f3fcb04002865ab67d5fb103533898" +checksum = "ddccb15bcce173023b3fedd9436f882a0739b8dfb45e4f6b6002bee5929f61b2" [[package]] -name = "sha1" -version = "0.10.5" +name = "sha2" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" +checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" dependencies = [ "cfg-if", "cpufeatures", @@ -753,9 +775,9 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "syn" -version = "1.0.103" +version = "1.0.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a864042229133ada95abf3b54fdc62ef5ccabe9515b64717bcb9a1919e59445d" +checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5" dependencies = [ "proc-macro2", "quote", @@ -778,27 +800,27 @@ dependencies = [ [[package]] name = "termcolor" -version = "1.1.3" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" +checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" dependencies = [ "winapi-util", ] [[package]] name = "thiserror" -version = "1.0.37" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10deb33631e3c9018b9baf9dcbbc4f737320d2b576bac10f6aefa048fa407e3e" +checksum = "6a9cd18aa97d5c45c6603caea1da6628790b37f7a34b6ca89522331c5180fed0" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.37" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "982d17546b47146b28f7c22e3d08465f6b8903d0ea13c1660d9d84a6e7adcdbb" +checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" dependencies = [ "proc-macro2", "quote", @@ -807,9 +829,9 @@ dependencies = [ [[package]] name = "time" -version = "0.1.44" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" +checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a" dependencies = [ "libc", "wasi 0.10.0+wasi-snapshot-preview1", @@ -837,9 +859,9 @@ dependencies = [ [[package]] name = "typenum" -version = "1.15.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" +checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" [[package]] name = "tzfile" @@ -858,15 +880,15 @@ checksum = "9e79c4d996edb816c91e4308506774452e55e95c3c9de07b6729e17e15a5ef81" [[package]] name = "unicode-ident" -version = "1.0.5" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3" +checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc" [[package]] name = "unicode-segmentation" -version = "1.10.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fdbf052a0783de01e944a6ce7a8cb939e295b1e7be835a1112c3b9a7f047a5a" +checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" [[package]] name = "unicode-width" @@ -900,9 +922,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.83" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268" +checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -910,9 +932,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.83" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142" +checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" dependencies = [ "bumpalo", "log", @@ -925,9 +947,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.83" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810" +checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -935,9 +957,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.83" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" +checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" dependencies = [ "proc-macro2", "quote", @@ -948,15 +970,15 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.83" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f" +checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "which" -version = "4.3.0" +version = "4.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c831fbbee9e129a8cf93e7747a82da9d95ba8e16621cae60ec2cdc849bacb7b" +checksum = "2441c784c52b289a054b7201fc93253e288f094e2f4be9058343127c4226a269" dependencies = [ "either", "libc", @@ -996,43 +1018,66 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-sys" -version = "0.36.1" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e2522491fbfcd58cc84d47aeb2958948c4b8982e9a2d8a2a35bbaed431390e7" +dependencies = [ + "windows_aarch64_gnullvm", "windows_aarch64_msvc", "windows_i686_gnu", "windows_i686_msvc", "windows_x86_64_gnu", + "windows_x86_64_gnullvm", "windows_x86_64_msvc", ] [[package]] -name = "windows_aarch64_msvc" -version = "0.36.1" +name = "windows_aarch64_gnullvm" +version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" +checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7" [[package]] name = "windows_i686_gnu" -version = "0.36.1" +version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" +checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640" [[package]] name = "windows_i686_msvc" -version = "0.36.1" +version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" +checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605" [[package]] name = "windows_x86_64_gnu" -version = "0.36.1" +version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" +checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463" [[package]] name = "windows_x86_64_msvc" -version = "0.36.1" +version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" +checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd" diff --git a/Cargo.toml b/Cargo.toml index 396b6c9..34106a8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,15 +5,15 @@ edition = "2021" [dependencies] chrono = "0.4.23" -clap = { version = "4.0.18", features = ["derive"] } +clap = { version = "4.1.4", features = ["derive"] } codespan-reporting = "0.11.1" colored = "2.0.0" computus = "1.0.0" directories = "4.0.1" edit = "0.1.4" -pest = "2.4.0" -pest_derive = "2.4.0" +pest = "2.5.5" +pest_derive = "2.5.5" promptly = "0.3.1" -termcolor = "1.1.3" -thiserror = "1.0.37" +termcolor = "1.2.0" +thiserror = "1.0.38" tzfile = { git = "https://github.com/Garmelon/tzfile.git", branch = "tzdir" } From 4001d0653be1b9bffdb2d7a9ee053147506f499c Mon Sep 17 00:00:00 2001 From: Joscha Date: Sat, 3 Aug 2024 03:31:37 +0200 Subject: [PATCH 18/20] Satisfy clippy --- src/files/format.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/files/format.rs b/src/files/format.rs index 280d58c..e16569a 100644 --- a/src/files/format.rs +++ b/src/files/format.rs @@ -75,10 +75,10 @@ impl fmt::Display for DateSpec { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { // Start write!(f, "{}", self.start)?; - for delta in &self.start_delta { + if let Some(delta) = &self.start_delta { write!(f, " {delta}")?; } - for time in &self.start_time { + if let Some(time) = &self.start_time { write!(f, " {time}")?; } @@ -109,7 +109,7 @@ impl fmt::Display for WeekdaySpec { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { // Start write!(f, "{}", self.start)?; - for time in &self.start_time { + if let Some(time) = &self.start_time { write!(f, " {time}")?; } @@ -171,10 +171,10 @@ impl fmt::Display for FormulaSpec { } else { write!(f, "*")?; } - for delta in &self.start_delta { + if let Some(delta) = &self.start_delta { write!(f, " {delta}")?; } - for time in &self.start_time { + if let Some(time) = &self.start_time { write!(f, " {time}")?; } From 22eec53c5ae1f6b14de7217c7ecf81496de5d712 Mon Sep 17 00:00:00 2001 From: Joscha Date: Thu, 21 Nov 2024 02:14:12 +0100 Subject: [PATCH 19/20] Move warnings to Cargo.toml --- Cargo.toml | 16 ++++++++++++++++ src/main.rs | 17 ----------------- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 34106a8..0ae8a9f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,3 +17,19 @@ promptly = "0.3.1" termcolor = "1.2.0" thiserror = "1.0.38" tzfile = { git = "https://github.com/Garmelon/tzfile.git", branch = "tzdir" } + +[lints] +rust.unsafe_code = { level = "forbid", priority = 1 } +rust.future_incompatible = "warn" +rust.rust_2018_idioms = "warn" +rust.noop_method_call = "warn" +rust.single_use_lifetimes = "warn" +rust.trivial_numeric_casts = "warn" +rust.unused = "warn" +rust.unused_crate_dependencies = "warn" +rust.unused_extern_crates = "warn" +rust.unused_import_braces = "warn" +rust.unused_lifetimes = "warn" +rust.unused_qualifications = "warn" +clippy.all = "warn" +clippy.use_self = "warn" diff --git a/src/main.rs b/src/main.rs index 84013df..4897001 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,20 +1,3 @@ -#![deny(unsafe_code)] -// Rustc lint groups -#![warn(future_incompatible)] -#![warn(rust_2018_idioms)] -// Rustc lints -#![warn(noop_method_call)] -#![warn(single_use_lifetimes)] -#![warn(trivial_numeric_casts)] -#![warn(unused_crate_dependencies)] -#![warn(unused_extern_crates)] -#![warn(unused_import_braces)] -#![warn(unused_lifetimes)] -#![warn(unused_qualifications)] -// Clippy lints -#![warn(clippy::all)] -#![warn(clippy::use_self)] - mod cli; mod error; mod eval; From abf4d5a502f9f97c59335c2f7b43cd76840b4079 Mon Sep 17 00:00:00 2001 From: Joscha Date: Thu, 21 Nov 2024 02:14:35 +0100 Subject: [PATCH 20/20] Silence remaining warnings --- src/eval/entry.rs | 1 + src/eval/range.rs | 1 + 2 files changed, 2 insertions(+) diff --git a/src/eval/entry.rs b/src/eval/entry.rs index f0f1e74..7ee93e0 100644 --- a/src/eval/entry.rs +++ b/src/eval/entry.rs @@ -61,6 +61,7 @@ impl Entry { /// Mode that determines how entries are filtered when they are added to /// an [`Entries`]. +#[allow(dead_code)] #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum EntryMode { /// The entry's root date must be contained in the range. diff --git a/src/eval/range.rs b/src/eval/range.rs index 88b6ec2..51ddcc0 100644 --- a/src/eval/range.rs +++ b/src/eval/range.rs @@ -37,6 +37,7 @@ impl DateRange { /// Return a new range with its [`Self::until`] set to a new value. /// /// Returns [`None`] if the new value is earlier than [`Self::from`]. + #[allow(dead_code)] pub fn with_until(&self, until: NaiveDate) -> Option { if self.from <= until { Some(Self::new(self.from, until))