From 170e291ec5a88044521c27e30a8c09ee2475f4e5 Mon Sep 17 00:00:00 2001 From: Joscha Date: Sun, 9 Jan 2022 16:40:17 +0100 Subject: [PATCH] Simplify DoneDate when formatting --- CHANGELOG.md | 1 + src/eval/date.rs | 36 ++++++++++-------------------------- src/files/commands.rs | 27 +++++++++++++++++++++++++++ src/files/format.rs | 3 +-- 4 files changed, 39 insertions(+), 28 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9e22c23..6d89c0e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - When saving... - Unchanged files are no longer overwritten - Commands are no longer reordered + - Done and cancel dates are simplified - Always prints import-based path, not absolute path ### Fixed diff --git a/src/eval/date.rs b/src/eval/date.rs index da8ce25..54eb2e1 100644 --- a/src/eval/date.rs +++ b/src/eval/date.rs @@ -149,32 +149,16 @@ impl From for Dates { impl From for DoneDate { fn from(dates: Dates) -> Self { - if dates.root == dates.other { - match dates.times { - Some(times) if times.root == times.other => Self::DateTime { - root: dates.root, - root_time: times.root, - }, - Some(times) => Self::DateTimeToTime { - root: dates.root, - root_time: times.root, - other_time: times.other, - }, - None => Self::Date { root: dates.root }, - } - } else { - match dates.times { - Some(times) => Self::DateTimeToDateTime { - root: dates.root, - root_time: times.root, - other: dates.other, - other_time: times.other, - }, - None => Self::DateToDate { - root: dates.root, - other: dates.other, - }, - } + let (root, other) = dates.dates(); + match dates.times() { + Some((root_time, other_time)) => Self::DateTimeToDateTime { + root, + root_time, + other, + other_time, + }, + None => Self::DateToDate { root, other }, } + .simplified() } } diff --git a/src/files/commands.rs b/src/files/commands.rs index 09eb631..f8f6f4f 100644 --- a/src/files/commands.rs +++ b/src/files/commands.rs @@ -307,6 +307,33 @@ impl DoneDate { DoneDate::DateTimeToDateTime { root, .. } => root, } } + + /// Remove redundancies like the same date or time specified twice. + pub fn simplified(self) -> Self { + let result = match self { + Self::DateToDate { root, other } if root == other => Self::Date { root }, + Self::DateTimeToDateTime { + root, + root_time, + other, + other_time, + } if root == other => Self::DateTimeToTime { + root, + root_time, + other_time, + }, + other => other, + }; + + match result { + Self::DateTimeToTime { + root, + root_time, + other_time, + } if root_time == other_time => Self::DateTime { root, root_time }, + other => other, + } + } } #[derive(Debug)] diff --git a/src/files/format.rs b/src/files/format.rs index b289048..368f60f 100644 --- a/src/files/format.rs +++ b/src/files/format.rs @@ -239,8 +239,7 @@ impl fmt::Display for Statement { impl fmt::Display for DoneDate { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - // TODO Remove redundant dates - match self { + 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),