1pub mod book;
6pub mod data;
7pub mod error;
8mod grammar;
9pub mod ledger;
10pub mod loader;
11pub mod utils;
12
13use pyo3::prelude::*;
14
15use data::AccBal;
16
17use crate::error::BeanError;
18use crate::ledger::Ledger;
19
20pub fn load(text: String) -> Ledger {
23 let entries = loader::load(&text);
24 let ledger = loader::consume(entries);
25 let mut dirs = ledger.dirs;
26 loader::sort(&mut dirs);
27 book::balance_transactions(&mut dirs);
28 utils::debug_directives(&dirs);
29 Ledger {
30 dirs,
31 errs: ledger.errs,
32 opts: ledger.opts,
33 }
34}
35
36pub fn balance(path: &str) -> (AccBal, Vec<BeanError>) {
38 let text = std::fs::read_to_string(path).expect("cannot read file");
39 let mut ledger = load(text);
40 let (bals, book_errs) = book::get_balances(&mut ledger.dirs);
41 let mut errs = ledger.errs;
42 errs.extend(book_errs);
43 (bals, errs)
44}
45
46#[pyfunction]
48#[pyo3(name = "load")]
49fn py_load(path: &str) -> Ledger {
50 let text = std::fs::read_to_string(path).expect("cannot read file");
51 load(text)
52}
53
54#[pymodule]
56fn _bean_rs(m: &Bound<'_, PyModule>) -> PyResult<()> {
57 m.add_function(wrap_pyfunction!(py_load, m)?)?;
58 Ok(())
59}