extern crate regex; #[macro_use] extern crate lazy_static; extern crate structopt; #[macro_use] extern crate structopt_derive; pub mod qif; use structopt::StructOpt; use 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; 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() -> Result<(), Box> { let args = CliArgs::from_args(); for filepath in &args.files { let qif_result = { let file = File::open(filepath)?; let file_reader = BufReader::new(file); let mut lines = file_reader.lines(); let mut qif_file = QifFile::new(lines.next().unwrap()?); let mut next_entry = Vec::new(); for line_result in lines { let line = line_result?; 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)?; writeln!(file, "{}", qif_result)?; } println!("Processed {} files", args.files.len()); Ok(()) }