bean_rs/
lib.rs

1//! # bean-rs
2//!
3//! `bean-rs` is a [beancount](https://github.com/beancount/beancount) clone (one day...) in Rust
4
5pub 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
20/// Loads the provided text into a Vec of Directives
21/// containing opens, closes, transactions etc
22pub 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
36/// Check and calculate balances for file at path
37pub 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/// Load the ledger from Python
47#[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/// `_bean_rs` importable from Python
55#[pymodule]
56fn _bean_rs(m: &Bound<'_, PyModule>) -> PyResult<()> {
57    m.add_function(wrap_pyfunction!(py_load, m)?)?;
58    Ok(())
59}