summaryrefslogtreecommitdiffstats
path: root/cli/src/search.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/src/search.rs')
-rw-r--r--cli/src/search.rs56
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> {