pub mod book;
pub mod data;
pub mod error;
mod grammar;
pub mod ledger;
pub mod loader;
pub mod utils;
use pyo3::prelude::*;
use data::AccBal;
use crate::error::BeanError;
use crate::ledger::Ledger;
pub fn load(text: String) -> Ledger {
let entries = loader::load(&text);
let ledger = loader::consume(entries);
let mut dirs = ledger.dirs;
loader::sort(&mut dirs);
book::balance_transactions(&mut dirs);
utils::debug_directives(&dirs);
Ledger {
dirs,
errs: ledger.errs,
opts: ledger.opts,
}
}
pub fn balance(path: &str) -> (AccBal, Vec<BeanError>) {
let text = std::fs::read_to_string(path).expect("cannot read file");
let mut ledger = load(text);
let (bals, book_errs) = book::get_balances(&mut ledger.dirs);
let mut errs = ledger.errs;
errs.extend(book_errs);
(bals, errs)
}
#[pyfunction]
fn py_load(path: &str) -> Ledger {
let text = std::fs::read_to_string(path).expect("cannot read file");
load(text)
}
#[pymodule]
fn bean_rs(m: &Bound<'_, PyModule>) -> PyResult<()> {
m.add_function(wrap_pyfunction!(py_load, m)?)?;
Ok(())
}