summaryrefslogtreecommitdiffstats
path: root/cli/src/search.rs
diff options
context:
space:
mode:
authorGustav Sörnäs <gustav@sornas.net>2021-07-29 15:10:48 +0200
committerGustav Sörnäs <gustav@sornas.net>2021-07-29 15:10:48 +0200
commitcf79a3180282f08a6165f4b88f52b78a14b9c688 (patch)
tree4aa3419ff3459034575d5f5566ef98524da8523e /cli/src/search.rs
parent174cd70001b8c01fc65c373e7dbd3ea6e0a6721c (diff)
downloadmoney-cf79a3180282f08a6165f4b88f52b78a14b9c688.tar.gz
initial searching
Diffstat (limited to 'cli/src/search.rs')
-rw-r--r--cli/src/search.rs62
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,
+ }
+ }
+}