diff options
| author | Gustav Sörnäs <gustav@sornas.net> | 2021-07-31 02:18:21 +0200 |
|---|---|---|
| committer | Gustav Sörnäs <gustav@sornas.net> | 2021-07-31 02:27:17 +0200 |
| commit | 15bade610a0c357cd6684deac81fe2db344f26f9 (patch) | |
| tree | 8c524a93a4db1bdf880edc4130433411c6c953e4 | |
| parent | e970d6f46271b167d2d2f8add29af984da3c31b4 (diff) | |
| download | money-15bade610a0c357cd6684deac81fe2db344f26f9.tar.gz | |
parse relative dates
| -rw-r--r-- | cli/src/main.rs | 6 | ||||
| -rw-r--r-- | cli/src/search.rs | 29 |
2 files changed, 14 insertions, 21 deletions
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<Duration> { + //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()), |
