diff options
| -rw-r--r-- | cli/src/main.rs | 5 | ||||
| -rw-r--r-- | cli/src/search.rs | 15 |
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)] |
