Explorar o código

[Convert] Added filtering for memos

Now DB will be clear than before by trimming unneeded prefixes

Signed-off-by: Slava Barinov <rayslava@gmail.com>
Slava Barinov %!s(int64=3) %!d(string=hai) anos
pai
achega
94c44617e2
Modificáronse 3 ficheiros con 53 adicións e 15 borrados
  1. 18 13
      src/convert.rs
  2. 34 1
      src/main.rs
  3. 1 1
      src/receipt.rs

+ 18 - 13
src/convert.rs

@@ -31,19 +31,21 @@ mod tests {
 }
 
 /// Generate set of QIF Splits from a Purchase items
-pub fn gen_splits<F>(
+pub fn gen_splits<F, C>(
     items: &[receipt::Item],
     cs: &mut CatStats,
     accounts: &[String],
-    categorizer: F,
+    filter: F,
+    categorizer: C,
 ) -> Vec<Split>
 where
-    F: Fn(&str, &mut CatStats, &[String]) -> String,
+    C: Fn(&str, &mut CatStats, &[String]) -> String,
+    F: Fn(&str) -> &str,
 {
     let mut result: Vec<Split> = Vec::new();
     for i in items.iter() {
         let t = Split::new()
-            .memo(i.name.as_str())
+            .memo(filter(i.name.as_str()))
             .amount(-i.sum)
             .category(&categorizer(i.name.as_str(), cs, accounts))
             .build();
@@ -59,12 +61,12 @@ pub fn gen_trans<'a>(
     date: DateTime<Utc>,
     sum: i64,
     memo: &str,
-    splits: Vec<Split>,
+    splits: &[Split],
 ) -> Result<Transaction<'a>, String> {
     let t = Transaction::new(acc)
         .date(date)
         .memo(memo)
-        .splits(&splits)
+        .splits(splits)
         .build();
 
     match t {
@@ -88,7 +90,7 @@ pub fn gen_trans<'a>(
 pub fn non_cat_items(filename: &str, user: &User) -> Vec<String> {
     let file = read_file(filename);
     let mut result: Vec<String> = Vec::new();
-    for i in &file.items {
+    for i in file.items {
         match get_top_category(i.name.as_str(), &user.catmap) {
             Some(_) => (),
             None => result.push(String::from(i.name.as_str())),
@@ -98,22 +100,25 @@ pub fn non_cat_items(filename: &str, user: &User) -> Vec<String> {
 }
 
 /// Convert `filename` into a QIF transaction
-pub fn convert<'a, F>(
+pub fn convert<'a, F, C>(
     filename: &'a str,
     memo: &str,
     user: &'a mut User,
     acc: &'a Account,
-    categorizer: F,
+    filter: F,
+    categorizer: C,
 ) -> Result<Transaction<'a>, String>
 where
-    F: Fn(&str, &mut CatStats, &[String]) -> String,
+    F: Fn(&str) -> &str,
+    C: Fn(&str, &mut CatStats, &[String]) -> String,
 {
-    let purchase = read_file(filename);
-    let splits = gen_splits(
+    let purchase = &read_file(filename);
+    let splits = &gen_splits(
         &purchase.items,
         &mut user.catmap,
         &user.accounts,
-        categorizer,
+        &filter,
+        &categorizer,
     );
     gen_trans(acc, purchase.date(), purchase.total_sum(), memo, splits)
 }

+ 34 - 1
src/main.rs

@@ -27,6 +27,14 @@ struct Cli {
     #[structopt(long, default_value = "New")]
     memo: String,
 
+    /// Add filter with cutting id from every item memo beginning
+    #[structopt(long)]
+    numfilt: bool,
+
+    /// Add filter with cutting "3*:" and numbers from the line (e.g. Perekrestok)
+    #[structopt(long)]
+    perfilt: bool,
+
     /// Run telegram bot
     #[cfg(feature = "telegram")]
     #[structopt(short, long)]
@@ -50,6 +58,24 @@ struct Cli {
     account_type: AccountType,
 }
 
+fn numfilter(line: &str) -> &str {
+    line.trim_start()
+        .trim_start_matches(char::is_numeric)
+        .trim_start()
+}
+
+fn perekrestok_filter(line: &str) -> &str {
+    numfilter(
+        line.trim_start()
+            .trim_start_matches(char::is_numeric)
+            .trim_start_matches(&['*', ':']),
+    )
+}
+
+fn nofilter(line: &str) -> &str {
+    line
+}
+
 #[cfg(not(tarpaulin_include))]
 fn main() {
     log::debug!("Log started");
@@ -74,6 +100,13 @@ fn main() {
         return;
     }
 
+    let filter = if args.numfilt { numfilter } else { nofilter };
+    let filter = if args.perfilt {
+        perekrestok_filter
+    } else {
+        filter
+    };
+
     // If program is used as command-line tool
     let acc = Account::new()
         .name(&args.account)
@@ -84,7 +117,7 @@ fn main() {
         let cat = &|item: &str, stats: &mut categories::CatStats, acc: &[String]| -> String {
             categories::get_category(item, stats, acc)
         };
-        let t = convert::convert(filename, &args.memo, &mut user, &acc, &cat).unwrap();
+        let t = convert::convert(filename, &args.memo, &mut user, &acc, filter, cat).unwrap();
         print!("{}", acc);
         println!("{}", t);
     }

+ 1 - 1
src/receipt.rs

@@ -9,7 +9,7 @@ pub struct Purchase {
 }
 
 impl Purchase {
-    pub fn total_sum(self) -> i64 {
+    pub fn total_sum(&self) -> i64 {
         self.sum
     }