summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGustav Sörnäs <gustav@sornas.net>2021-07-31 02:18:21 +0200
committerGustav Sörnäs <gustav@sornas.net>2021-07-31 02:27:17 +0200
commit15bade610a0c357cd6684deac81fe2db344f26f9 (patch)
tree8c524a93a4db1bdf880edc4130433411c6c953e4
parente970d6f46271b167d2d2f8add29af984da3c31b4 (diff)
downloadmoney-15bade610a0c357cd6684deac81fe2db344f26f9.tar.gz
parse relative dates
-rw-r--r--cli/src/main.rs6
-rw-r--r--cli/src/search.rs29
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()),