Преглед на файлове

[Convert] Moved convert function into corresponding module

Signed-off-by: Slava Barinov <rayslava@gmail.com>
Slava Barinov преди 4 години
родител
ревизия
40235c5bfd
променени са 2 файла, в които са добавени 24 реда и са изтрити 6 реда
  1. 20 3
      src/convert.rs
  2. 4 3
      src/main.rs

+ 20 - 3
src/convert.rs

@@ -1,10 +1,12 @@
 use crate::categories::get_category;
 use crate::categories::CatStats;
 use crate::receipt;
+use crate::user::User;
 use chrono::{Date, Utc};
 use qif_generator::{account::Account, split::Split, transaction::Transaction};
 use std::fs;
 
+/// Read json file with receipt and convert it into `receipt::Purchase`
 pub fn read_file(f: &str) -> receipt::Purchase {
     let json = fs::read_to_string(f).expect("Can't read file");
     receipt::parse_purchase(&json)
@@ -27,6 +29,7 @@ mod tests {
     }
 }
 
+/// Generate set of QIF Splits from a Purchase items
 pub fn gen_splits(items: &[receipt::Item], cs: &mut CatStats) -> Vec<Split> {
     let mut result: Vec<Split> = Vec::new();
     for i in items.iter() {
@@ -41,16 +44,18 @@ pub fn gen_splits(items: &[receipt::Item], cs: &mut CatStats) -> Vec<Split> {
     result
 }
 
+/// Generate QIF transaction from `splits`
 pub fn gen_trans<'a>(
     acc: &'a Account,
     date: Date<Utc>,
     sum: i64,
-    splits: &'a [Split],
+    memo: &str,
+    splits: Vec<Split>,
 ) -> Result<Transaction<'a>, String> {
     let t = Transaction::new(acc)
         .date(date)
-        .memo("New")
-        .splits(splits)
+        .memo(memo)
+        .splits(&splits)
         .build();
 
     match t {
@@ -68,3 +73,15 @@ pub fn gen_trans<'a>(
         Err(e) => Err(e),
     }
 }
+
+/// Convert `filename` into a QIF transaction
+pub fn convert<'a>(
+    filename: &'a str,
+    memo: &str,
+    user: &'a mut User,
+    acc: &'a Account,
+) -> Result<Transaction<'a>, String> {
+    let purchase = read_file(filename);
+    let splits = gen_splits(&purchase.items, &mut user.catmap);
+    gen_trans(&acc, purchase.date(), purchase.total_sum(), memo, splits)
+}

+ 4 - 3
src/main.rs

@@ -24,6 +24,9 @@ struct Cli {
     #[structopt(short, long)]
     database: Option<String>,
 
+    #[structopt(short, long, default_value = "New")]
+    memo: String,
+
     /// Run telegram bot
     #[structopt(short, long)]
     telegram: bool,
@@ -47,14 +50,12 @@ fn main() {
     }
 
     // If program is used as command-line tool
-    let purchase = convert::read_file(&args.filename);
-    let splits = convert::gen_splits(&purchase.items, &mut user.catmap);
     let acc = Account::new()
         .name("Wallet")
         .account_type(AccountType::Cash)
         .build();
 
-    let t = convert::gen_trans(&acc, purchase.date(), purchase.total_sum(), &splits).unwrap();
+    let t = convert::convert(&args.filename, &args.memo, &mut user, &acc).unwrap();
     print!("{}", acc.to_string());
     println!("{}", t.to_string());