summaryrefslogtreecommitdiffstats
path: root/cli
diff options
context:
space:
mode:
authorGustav Sörnäs <gustav@sornas.net>2021-08-03 15:21:36 +0200
committerGustav Sörnäs <gustav@sornas.net>2021-08-03 15:21:36 +0200
commitb9c2a3fd86a34a185810b54273c59e92cfaaed84 (patch)
treea4fc86e730d04cba05d1648a2b1c3df711e2e796 /cli
parentb3da8ba67c91deef80054d2b4c34ddec7120ba7a (diff)
downloadmoney-b9c2a3fd86a34a185810b54273c59e92cfaaed84.tar.gz
parse filters again
Diffstat (limited to 'cli')
-rw-r--r--cli/src/main.rs5
-rw-r--r--cli/src/search.rs15
2 files changed, 15 insertions, 5 deletions
diff --git a/cli/src/main.rs b/cli/src/main.rs
index bb9e321..bf19f29 100644
--- a/cli/src/main.rs
+++ b/cli/src/main.rs
@@ -15,6 +15,8 @@ use search::Search;
use store::Store;
use transaction::{Transaction, TransactionKind};
+use crate::search::parse_filters;
+
//TODO relative ("yesterday", "-2d", etc)
fn parse_date(s: &str) -> Result<NaiveDate, String> {
NaiveDate::parse_from_str(s, "%Y-%m-%d").map_err(|e| e.to_string())
@@ -136,7 +138,8 @@ fn main() {
} => {
let mut search = Search::new(&store.transactions());
if !filters.is_empty() {
- search = search.parse(filters.join(" "));
+ let filters = parse_filters(&filters.join(" "));
+ search = search.apply(filters);
}
let mut transactions = search.get();
if sort.is_empty() {
diff --git a/cli/src/search.rs b/cli/src/search.rs
index 6692b00..ab68365 100644
--- a/cli/src/search.rs
+++ b/cli/src/search.rs
@@ -1,8 +1,9 @@
use chrono::{naive::NaiveDate, Duration};
use nom::branch::alt;
use nom::bytes::complete::{is_not, tag, take};
-use nom::character::complete::{alphanumeric1, anychar, char, digit1};
+use nom::character::complete::{alphanumeric1, anychar, char, digit1, space1};
use nom::combinator::{map, map_res, recognize};
+use nom::multi::separated_list0;
use nom::sequence::{delimited, pair, preceded};
use rust_decimal::Decimal;
use std::convert::TryFrom;
@@ -277,10 +278,16 @@ impl<'t> Search<'t> {
}
self
}
+}
- pub fn parse(mut self, rules: String) -> Self {
- todo!()
- }
+pub fn parse_filters(i: &str) -> Filter {
+ map(
+ separated_list0(
+ space1,
+ Filter::parse
+ ),
+ |filters| Filter::Intersect(Constraint::Filters(filters))
+ )(i).unwrap().1
}
#[cfg(test)]