pub mod qif; use clap::Parser; use qif::*; use std::{ error::Error, fs::File, io::{prelude::*, *}, path::PathBuf, result::Result, }; /// Qif file preprocessor to decrease duplication when importing to gnucash #[derive(Parser, Debug)] #[structopt( name = "Qif Parser", version, about, long_about = None )] struct CliArgs { /// Files to preprocess #[arg(value_hint = clap::ValueHint::FilePath)] files: Vec, } fn main() -> Result<(), Box> { let args = CliArgs::parse(); 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 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); } } let mut file = File::create(filepath)?; writeln!(file, "{}", qif_file)?; } else { println!("{} was empty", filepath.display()); } } println!("Processed {} files", args.files.len()); Ok(()) }