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; use std::error::Error; 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 file = File::open(filepath)?; let file_reader = BufReader::new(file); let mut lines = file_reader.lines(); if let Some(header_line) = lines.next() { let qif_result = { let mut qif_file = QifFile::new(header_line?); let mut next_entry = Vec::new(); for line_result in lines { let line = line_result?; if line == String::from("^") { let new_qif_entry = QifEntry::new(&next_entry)?; qif_file.push(new_qif_entry); next_entry.clear(); } else { next_entry.push(line); } } qif_file }; let mut file = File::create(filepath)?; writeln!(file, "{}", qif_result)?; } else { println!("{} was empty", filepath.display()); } } println!("Processed {} files", args.files.len()); Ok(()) }