From c69af9bcde2ef9e406ab2342be0b512b5bc6b749 Mon Sep 17 00:00:00 2001 From: Joscha Date: Tue, 14 Dec 2021 23:32:04 +0100 Subject: [PATCH] Unify Dates logic and expand DoneDate format --- src/cli/layout/day.rs | 24 +++--- src/cli/show.rs | 16 +--- src/eval/date.rs | 178 ++++++++++++++++++----------------------- src/eval/entry.rs | 6 +- src/files/commands.rs | 9 ++- src/files/format.rs | 9 ++- src/files/grammar.pest | 1 + src/files/parse.rs | 9 ++- 8 files changed, 119 insertions(+), 133 deletions(-) diff --git a/src/cli/layout/day.rs b/src/cli/layout/day.rs index 2614f8b..0cb4c0b 100644 --- a/src/cli/layout/day.rs +++ b/src/cli/layout/day.rs @@ -80,7 +80,7 @@ impl DayLayout { fn layout_task(&mut self, index: usize, entry: &Entry) { if let Some(dates) = entry.dates { - let (start, end) = dates.start_end(); + let (start, end) = dates.sorted().dates(); if self.today < start && (start - self.today).num_days() < 7 { // TODO Make this adjustable, maybe even per-command let days = (start - self.today).num_days(); @@ -100,8 +100,9 @@ impl DayLayout { fn layout_task_done(&mut self, index: usize, entry: &Entry, at: NaiveDate) { if let Some(dates) = entry.dates { - if at > dates.end() { - let days = (at - dates.end()).num_days(); + let (_, end) = dates.sorted().dates(); + if at > end { + let days = (at - end).num_days(); self.insert(at, DayEntry::ReminderSince(index, days)); } self.layout_dated_entry(index, dates); @@ -113,7 +114,7 @@ impl DayLayout { fn layout_note(&mut self, index: usize, entry: &Entry) { if let Some(dates) = entry.dates { - let (start, end) = dates.start_end(); + let (start, end) = dates.sorted().dates(); if start < self.range.from() && self.range.until() < end { // This note applies to the current day, but it won't appear if // we just layout it as a dated entry, so instead we add it as a @@ -131,9 +132,10 @@ impl DayLayout { } fn layout_dated_entry(&mut self, index: usize, dates: Dates) { - let (start, end) = dates.start_end(); + let sorted_dates = dates.sorted(); + let (start, end) = sorted_dates.dates(); #[allow(clippy::if_same_then_else)] // Makes the code easier to read - if let Some((date, time)) = dates.point_in_time() { + if let Some((date, time)) = sorted_dates.point_in_time() { let entry = match time { Some(time) => DayEntry::TimedAt(index, time, None), None => DayEntry::At(index), @@ -149,7 +151,7 @@ impl DayLayout { // omit them both. Otherwise, we would get a bracket without any // visible start or end. } else { - let (start_entry, end_entry) = match dates.start_end_time() { + let (start_entry, end_entry) = match sorted_dates.times() { Some((start_time, end_time)) => ( DayEntry::TimedStart(index, start_time), DayEntry::TimedEnd(index, end_time), @@ -196,13 +198,13 @@ impl DayLayout { // 2. entries.sort_by(|(_, e1, _), (_, e2, _)| { - let d1 = e1.dates.map(|d| (d.end(), d.end_time())); - let d2 = e2.dates.map(|d| (d.end(), d.end_time())); - d2.cmp(&d1) + let d1 = e1.dates.map(|d| d.sorted().other_with_time()); + let d2 = e2.dates.map(|d| d.sorted().other_with_time()); + d2.cmp(&d1) // Inverse comparison }); // 1. - entries.sort_by_key(|(_, e, _)| e.dates.map(|d| (d.start(), d.start_time()))); + entries.sort_by_key(|(_, e, _)| e.dates.map(|d| d.sorted().root_with_time())); } fn sort_day(day: &mut Vec) { diff --git a/src/cli/show.rs b/src/cli/show.rs index c93e971..9d8262a 100644 --- a/src/cli/show.rs +++ b/src/cli/show.rs @@ -145,22 +145,10 @@ pub fn show_entry(files: &Files, entry: &Entry) -> Result<()> { } if let Some(dates) = entry.dates { - let (start, end) = dates.start_end(); - if start == end { - match dates.start_end_time() { - Some((s, e)) if s == e => println!("DATE {} {}", start, s), - Some((s, e)) => println!("DATE {} {} -- {}", start, s, e), - None => println!("DATE {}", start), - } - } else { - match dates.start_end_time() { - Some((s, e)) => println!("DATE {} {} -- {} {}", start, s, end, e), - None => println!("DATE {} -- {}", start, end), - } - } + println!("DATE {}", dates.sorted()); } else { println!("NO DATE"); - }; + } for line in command.desc() { println!("# {}", line); diff --git a/src/eval/date.rs b/src/eval/date.rs index c2db627..61b2908 100644 --- a/src/eval/date.rs +++ b/src/eval/date.rs @@ -20,44 +20,8 @@ pub struct Dates { impl fmt::Display for Dates { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let (start, end) = self.start_end(); - match self.start_end_time() { - Some((start_time, end_time)) if start == end && start_time == end_time => { - write!(f, "{} {}", start, start_time) - } - Some((start_time, end_time)) if start == end => { - write!(f, "{} {} -- {}", start, start_time, end_time) - } - Some((start_time, end_time)) => { - write!(f, "{} {} -- {} {}", start, start_time, end, end_time) - } - None if start == end => write!(f, "{}", start), - None => write!(f, "{} -- {}", start, end), - } - } -} - -impl From for DoneDate { - fn from(dates: Dates) -> Self { - match dates.times { - Some(times) if dates.root == dates.other && times.root == times.other => { - DoneDate::DateWithTime { - root: dates.root, - root_time: times.root, - } - } - Some(times) => DoneDate::DateToDateWithTime { - root: dates.root, - root_time: times.root, - other: dates.other, - other_time: times.other, - }, - None if dates.root == dates.other => DoneDate::Date { root: dates.root }, - None => DoneDate::DateToDate { - root: dates.root, - other: dates.other, - }, - } + let done_date: DoneDate = (*self).into(); + write!(f, "{}", done_date) } } @@ -86,66 +50,55 @@ impl Dates { } } - pub fn root(&self) -> NaiveDate { + pub fn root(self) -> NaiveDate { self.root } - pub fn other(&self) -> NaiveDate { - self.other + pub fn root_with_time(self) -> (NaiveDate, Option