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::ffi::{OsString, OsStr}; use std::path::PathBuf; use std::result::Result; use std::fs::File; use std::process; fn parse_filepath(str: &OsStr) -> Result { let path: PathBuf = ::std::convert::From::from(str); if path.is_file() { Ok(path) } else { Err(str.to_os_string()) } } #[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(try_from_os_str="parse_filepath"))] files: Vec } fn main() { let args = CliArgs::from_args(); 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()); }