summaryrefslogtreecommitdiff
path: root/src/web_frontend/transactions.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/web_frontend/transactions.rs')
-rw-r--r--src/web_frontend/transactions.rs57
1 files changed, 55 insertions, 2 deletions
diff --git a/src/web_frontend/transactions.rs b/src/web_frontend/transactions.rs
index 54aacf9..f6d65af 100644
--- a/src/web_frontend/transactions.rs
+++ b/src/web_frontend/transactions.rs
@@ -30,9 +30,62 @@ struct TransactionContext {
date_end : String
}
+struct TransactionFilter {
+ sender_name_filter : Vec<String>,
+ reference_filter : Vec<String>
+}
+
+/*
+ * files syntax: . seperates different search critereas
+ * a search crietera is a key value pair, with key as fiter type, e.g.
+ * sender name of transation. The value is what is should be and can be a regex
+ * key value pair is split by -
+ */
fn apply_transaction_filter(filter : String, transactions : Vec<crate::banking::account::Transaction>) -> Vec<crate::banking::account::Transaction> {
- let re = Regex::new(&filter).unwrap();
- let tmp = transactions.into_iter().filter(|transaction| re.is_match(&transaction.sender_name) || re.is_match(&transaction.reference) ).collect();
+ let mut tmp = transactions.clone();
+ // special case if for general search
+ if !filter.to_string().contains(".") {
+ println!("in special case");
+ let re = Regex::new(&filter).unwrap();
+ tmp = transactions.into_iter().filter(|transaction| re.is_match(&transaction.sender_name) || re.is_match(&transaction.reference) ).collect();
+ return tmp;
+ }
+
+ // parse filter string and construct TransactionFilter struct
+ let mut sender_name_vec = Vec::new();
+ let mut reference_vec = Vec::new();
+ for entry in filter.to_string().split(".") {
+ let v : Vec<_> = entry.split("-").collect();
+ println!("{:?}", v);
+ if v.len() > 1 {
+ if v[0] == "sender" {
+ println!("Filter for sender_name");
+ sender_name_vec.push(v[1].to_string());
+ }
+ else if v[0] == "reference" {
+ println!("filter for reference");
+ reference_vec.push(v[1].to_string());
+ }
+ }
+
+ }
+ tmp = transactions.clone().into_iter().filter(|transaction| {
+ let mut sender_match = false;
+ let mut reference_match = false;
+ for sender in &sender_name_vec {
+ let re_sender = Regex::new(&sender).unwrap();
+ if re_sender.is_match(&transaction.sender_name) {
+ sender_match = true;
+ }
+ }
+ for reference in &reference_vec {
+ let re = Regex::new(&reference).unwrap();
+ if re.is_match(&transaction.reference) {
+ reference_match = true;
+ }
+ }
+ sender_match || reference_match
+ }).collect();
tmp
}