extern crate structopt; #[macro_use] extern crate structopt_derive; use structopt::StructOpt; extern crate qif_parser; use qif_parser::qif::*; use std::io::prelude::*; use std::io::*; use std::path::PathBuf; use std::fs::File; use std::process; #[derive(StructOpt, Debug)] #[structopt(name = "Qif Parser", about = "Qif file preprocessor to decrease duplication when importing to gnucash")] struct CliArgs { #[structopt(help = "Files to preprocess", required, parse(from_os_str))] files: Vec } fn main() { let args = CliArgs::from_args(); for filepath in &args.files { if !filepath.is_file() { eprintln!("{} is not a file", filepath.display()); process::exit(1); } } for filepath in &args.files { let qif_result = { let file = File::open(filepath).unwrap(); let file_reader = BufReader::new(file); let mut lines = file_reader.lines(); let mut qif_file = QifFile::new(lines.next().unwrap().unwrap()); let mut next_entry = Vec::new(); for line_result in lines { let line = line_result.unwrap(); if line == String::from("^") { qif_file.append_non_empty(QifEntry::new(&next_entry)); next_entry.clear(); } else { next_entry.push(line); } } qif_file }; let mut file = File::create(filepath).unwrap(); writeln!(file, "{}", qif_result).unwrap(); } println!("Processed {} files", args.files.len()); }