From 15bade610a0c357cd6684deac81fe2db344f26f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gustav=20S=C3=B6rn=C3=A4s?= Date: Sat, 31 Jul 2021 02:18:21 +0200 Subject: parse relative dates --- cli/src/main.rs | 6 ------ cli/src/search.rs | 29 ++++++++++++++--------------- 2 files changed, 14 insertions(+), 21 deletions(-) (limited to 'cli/src') diff --git a/cli/src/main.rs b/cli/src/main.rs index 6b8da59..254a5e2 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -75,12 +75,6 @@ struct Mn { fn main() { let mut store = Store::open(PathBuf::from("store")).unwrap(); - // let search = search.subtract(Constraint::Category("a".to_string())); - // let search = search.subtract(Constraint::Date(DateFilter::Relative { - // start: None, - // end: Some(Duration::days(-2)), - // })); - let args = Mn::from_args(); eprintln!("{:?}", args); match args.command { diff --git a/cli/src/search.rs b/cli/src/search.rs index b74d20d..7f85a5c 100644 --- a/cli/src/search.rs +++ b/cli/src/search.rs @@ -15,7 +15,19 @@ pub enum DateIsh { impl DateIsh { pub fn parse(s: &str) -> Self { - DateIsh::Absolute(NaiveDate::parse_from_str(s, "%Y-%m-%d").unwrap()) + NaiveDate::parse_from_str(s, "%Y-%m-%d") + .map(DateIsh::Absolute) + .unwrap_or_else(|_| DateIsh::Relative(Self::parse_relative(s).unwrap())) + } + + pub fn parse_relative(s: &str) -> Option { + //TODO Month and year. Would depend on current date so maybe parse in one place. + let num = s[..s.len()-1].parse().unwrap(); + Some(match s.chars().last().unwrap() { + 'd' => Duration::days(num), + 'w' => Duration::weeks(num), + _ => unimplemented!(), + }) } pub fn get(self) -> NaiveDate { @@ -132,20 +144,7 @@ impl<'t> Search<'t> { //TODO lexing? can do a function for "spaces inside" instead - // +category:a - //TODO: category:"foo bar" - - // before:2021-01-01 => + (* -> 2020-12-31) n-incl - // after:2021-01-01 => + (2021-01-01 -> *) incl - // -before:2021-01-01 => - (2021-01-01 -> *) incl - // -after:2021-01-01 => - (* -> 2021-12-31) n-incl - - //TODO: - // today is 2021-01-01: - // before:-1d => + (* -> 2020-12-31) n-incl - // after:-1d => + (2021-01-01 -> *) incl - // -before:-1d => - (2021-01-01 -> *) incl - // -after:-1d => - (* -> 2020-12-31) n-incl + //TODO category:"foo bar" let constraint = match rule.split_once(':').unwrap() { ("category", category) => Constraint::Category(category.to_string()), -- cgit v1.2.1