diff options
| author | Benedict Börger <benedict@0xb8000.de> | 2019-06-22 23:55:47 +0200 |
|---|---|---|
| committer | Benedict Börger <benedict@0xb8000.de> | 2019-06-22 23:55:47 +0200 |
| commit | eef5efc67b9f0b2eeede9a6d89d2de796634acb7 (patch) | |
| tree | bc1f623d30e047a113e6724cc1f07e4252c165b8 /src | |
| parent | 36716cf5a971811019280614f8d6ea68c91cdba8 (diff) | |
[web_frontend][transaction] implement filter syntax
Diffstat (limited to 'src')
| -rw-r--r-- | src/web_frontend/transactions.rs | 57 |
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 } |
