diff options
| author | Gustav Sörnäs <gustav@sornas.net> | 2021-07-31 20:35:32 +0200 |
|---|---|---|
| committer | Gustav Sörnäs <gustav@sornas.net> | 2021-07-31 20:35:32 +0200 |
| commit | 36fa853174d2af7f79b413e007c57cac3b393452 (patch) | |
| tree | 5c0173b503dfcac8c4266fac51a86c880043217c | |
| parent | 1247ce7e43fc39c9e89f366dae16feb850671abc (diff) | |
| download | money-36fa853174d2af7f79b413e007c57cac3b393452.tar.gz | |
merge paths
| -rw-r--r-- | cli/src/search.rs | 56 |
1 files changed, 17 insertions, 39 deletions
diff --git a/cli/src/search.rs b/cli/src/search.rs index 0ad14ea..331fbf7 100644 --- a/cli/src/search.rs +++ b/cli/src/search.rs @@ -45,6 +45,17 @@ pub enum Constraint { On(DateIsh) } +impl Constraint { + fn satisfies(&self, transaction: &Transaction) -> bool { + match self { + Constraint::Category(category) => &transaction.category == category, + Constraint::Before(date) => transaction.date < date.clone().get(), + Constraint::After(date) => transaction.date >= date.clone().get(), + Constraint::On(date) => transaction.date == date.clone().get(), + } + } +} + enum FilterType { Union(Constraint), Intersect(Constraint), @@ -54,13 +65,13 @@ enum FilterType { impl FilterType { fn apply<'s>(&self, mut search: Search<'s>) -> Search<'s> { match self { - FilterType::Union(_) => { + FilterType::Union(constraint) => { //TODO binary search and insert sorted for idx in search .transactions .iter() .enumerate() - .filter(|(_, t)| self.satisfies(t)) + .filter(|(_, t)| constraint.satisfies(t)) .map(|(idx, _)| idx) { search.filtered.push(idx); @@ -68,58 +79,25 @@ impl FilterType { search.filtered.sort(); search.filtered.dedup(); } - FilterType::Intersect(_) => { + FilterType::Intersect(constraint) => { search.filtered = search .filtered .iter() - .filter(|t| self.satisfies(search.transactions[**t])) + .filter(|t| constraint.satisfies(search.transactions[**t])) .copied() .collect(); } - FilterType::Subtract(_) => { + FilterType::Subtract(constraint) => { search.filtered = search .filtered .iter() - .filter(|t| !self.satisfies(search.transactions[**t])) + .filter(|t| !constraint.satisfies(search.transactions[**t])) .copied() .collect(); } } search } - - fn satisfies(&self, transaction: &Transaction) -> bool { - match self { - // Category - FilterType::Union(Constraint::Category(category)) - | FilterType::Subtract(Constraint::Category(category)) - | FilterType::Intersect(Constraint::Category(category)) - => &transaction.category == category, - - FilterType::Intersect(Constraint::Before(date)) - => transaction.date < date.clone().get(), - - FilterType::Intersect(Constraint::After(date)) - => transaction.date >= date.clone().get(), - - FilterType::Subtract(Constraint::Before(date)) - => transaction.date < date.clone().get(), - - FilterType::Subtract(Constraint::After(date)) - => transaction.date >= date.clone().get(), - - FilterType::Union(Constraint::Before(date)) - => transaction.date < date.clone().get(), - - FilterType::Union(Constraint::After(date)) - => transaction.date >= date.clone().get(), - - FilterType::Intersect(Constraint::On(date)) - | FilterType::Subtract(Constraint::On(date)) - | FilterType::Union(Constraint::On(date)) - => transaction.date == date.clone().get(), - } - } } impl<'t> Search<'t> { |
