ledger.rs 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. use super::{AccountName, UnitName, Spanned};
  2. mod parse;
  3. pub use parse::parse_ledger;
  4. mod print;
  5. pub use print::print_ledger;
  6. #[derive(Clone, Debug, PartialEq, PartialOrd, Ord, Eq)]
  7. pub struct Balance {
  8. pub account: Spanned<AccountName>,
  9. pub amount: Spanned<rust_decimal::Decimal>,
  10. pub unit: Spanned<UnitName>,
  11. }
  12. #[derive(Clone, Debug, PartialEq, PartialOrd, Eq, Ord)]
  13. pub struct LedgerEntry {
  14. pub datestamp: (u16, u8, u8),
  15. pub title: Option<String>,
  16. pub balances: Vec<Spanned<Balance>>,
  17. }
  18. impl LedgerEntry {
  19. pub fn modifies(&self, account: AccountName) -> bool {
  20. self.balances.iter().any(|b| b.account.as_ref() == &account)
  21. }
  22. pub fn balance_for(&self, account: AccountName) -> Option<&Spanned<Balance>> {
  23. self.balances.iter().find(|b| b.account.as_ref() == &account)
  24. }
  25. pub fn split_balances(
  26. &self,
  27. account: AccountName,
  28. ) -> Option<(&Spanned<Balance>, impl Iterator<Item = &Spanned<Balance>>)> {
  29. let index = self.balances.iter().position(|b| b.account.as_ref() == &account)?;
  30. Some((
  31. &self.balances[index],
  32. self.balances[0..index]
  33. .iter()
  34. .chain(self.balances[index + 1..].iter()),
  35. ))
  36. }
  37. }