mod book;
mod directives;
mod error;
mod grammar;
mod parser;
mod utils;
use crate::directives::Directive;
use crate::error::BeanError;
fn load(text: String) -> (Vec<Directive>, Vec<BeanError>) {
let entries = parser::parse(&text);
let entries = match entries {
Ok(entries) => entries,
Err(error) => {
let empty_dirs: Vec<Directive> = Vec::new();
return (empty_dirs, vec![error]);
}
};
let (dirs, errs) = parser::consume(entries);
let mut dirs = dirs;
parser::sort(&mut dirs);
book::balance_transactions(&mut dirs);
utils::debug_directives(&dirs);
(dirs, errs)
}
pub fn balance(path: &String) {
let text = std::fs::read_to_string(path).expect("cannot read file");
let (mut dirs, mut errs) = load(text);
let (bals, book_errs) = book::get_balances(&mut dirs);
errs.extend(book_errs);
utils::print_errors(errs);
utils::print_bals(bals);
}