From cf79a3180282f08a6165f4b88f52b78a14b9c688 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gustav=20S=C3=B6rn=C3=A4s?= Date: Thu, 29 Jul 2021 15:10:48 +0200 Subject: initial searching --- cli/src/search.rs | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 cli/src/search.rs (limited to 'cli/src/search.rs') 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, + transactions: Vec<&'t Transaction>, +} + +pub enum DateFilter { + Absolute { + start: Option, + end: Option, + }, + Relative { + start: Option, + end: Option, + } +} + +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, + } + } +} -- cgit v1.2.1