diff options
Diffstat (limited to 'cli/src/search.rs')
| -rw-r--r-- | cli/src/search.rs | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/cli/src/search.rs b/cli/src/search.rs new file mode 100644 index 0000000..d388a8b --- /dev/null +++ b/cli/src/search.rs @@ -0,0 +1,62 @@ +use chrono::{naive::NaiveDate, Duration}; + +use crate::transaction::{Category, Transaction}; + +pub struct Search<'t> { + filtered: Vec<usize>, + transactions: Vec<&'t Transaction>, +} + +pub enum DateFilter { + Absolute { + start: Option<NaiveDate>, + end: Option<NaiveDate>, + }, + Relative { + start: Option<Duration>, + end: Option<Duration>, + } +} + +pub enum Constraint { + Category(Category), + Date(DateFilter), +} + +impl Constraint { + fn satisfies(&self, t: &Transaction) -> bool { + match self { + Constraint::Category(category) => category == &t.category, + Constraint::Date(_) => todo!(), + } + } +} + +impl<'t> Search<'t> { + pub fn new(transactions: Vec<&'t Transaction>) -> Self { + Self { + filtered: std::iter::successors(Some(0_usize), |n| Some(n.checked_add(1).unwrap())).take(transactions.len()).collect(), + transactions, + } + } + + pub fn get(&self) -> Vec<&'t Transaction> { + self + .filtered + .iter() + .map(|idx| self.transactions[*idx]) + .collect() + } + + pub fn subtract(self, constraint: Constraint) -> Self { + Self { + filtered: self + .filtered + .iter() + .copied() + .filter(|idx| !constraint.satisfies(self.transactions[*idx])) + .collect(), + transactions: self.transactions, + } + } +} |
