Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- use regex::Regex;
- use std::fs::File;
- use std::io::BufRead;
- use std::io::BufReader;
- use std::io::Result;
- use std::path::PathBuf;
- #[derive(Debug)]
- pub(crate) enum LedgerValue {
- Comment {
- value: String,
- },
- Transaction {
- date: String,
- payee: String,
- values: Vec<TransactionValue>,
- },
- }
- #[derive(Debug)]
- pub(crate) enum TransactionValue {
- Comment {
- value: String,
- },
- Account {
- name: String,
- expression: String,
- },
- }
- pub(crate) fn load(path: PathBuf) -> Result<Vec<LedgerValue>> {
- const LEDGER_COMMENTS: &'static str = r#"^; (?P<comment>[[:print:]]+)\s*$"#;
- const DATE_PAYEE: &'static str = r#"(?P<date>^\d{4}/\d{2}/\d{2})(?P<payee>.*)$"#;
- const ACCOUNT_VALUE: &'static str = r#"^\s+(?P<account>[[:print:]]+)\s*(?P<expression>[[:print:]]*$)"#;
- const TRANSACTION_COMMENTS: &'static str = r#"^\s+; (?P<comment>[[:print:]]+)\s*$"#;
- let ledger_comments_reg = Regex::new(LEDGER_COMMENTS).unwrap();
- let date_payee_reg = Regex::new(DATE_PAYEE).unwrap();
- let account_value_reg = Regex::new(ACCOUNT_VALUE).unwrap();
- let transaction_comments_reg = Regex::new(TRANSACTION_COMMENTS).unwrap();
- let input = File::open(path)?;
- let buffered = BufReader::new(input);
- let lines = buffered.lines();
- let mut iter = lines.into_iter();
- let mut ledger = Vec::new();
- let mut transaction_date = String::new();
- let mut transaction_payee = String::new();
- let mut transaction_values = Vec::new();
- for line in &mut iter {
- let line = line.unwrap();
- if let Some(caps) = ledger_comments_reg.captures(&line) {
- ledger.push(LedgerValue::Comment {
- value: caps["comment"].to_string()
- });
- } else if let Some(caps) = date_payee_reg.captures(&line) {
- transaction_date = caps["date"].to_string();
- transaction_payee = caps["payee"].trim().to_string();
- break;
- }
- }
- for line in &mut iter {
- let line = line.unwrap();
- if let Some(caps) = date_payee_reg.captures(&line) {
- ledger.push(LedgerValue::Transaction {
- date: transaction_date,
- payee: transaction_payee,
- values: transaction_values,
- });
- transaction_date = caps["date"].to_string();
- transaction_payee = caps["payee"].trim().to_string();
- transaction_values = Vec::new();
- } else if let Some(caps) = transaction_comments_reg.captures(&line) {
- let value = TransactionValue::Comment {
- value: caps["comment"].to_string()
- };
- transaction_values.push(value);
- } else if let Some(caps) = account_value_reg.captures(&line) {
- let value = TransactionValue::Account {
- name: caps["account"].to_string(),
- expression: caps["expression"].to_string(),
- };
- transaction_values.push(value);
- }
- }
- ledger.push(LedgerValue::Transaction {
- date: transaction_date,
- payee: transaction_payee,
- values: transaction_values,
- });
- Ok(ledger)
- }
Add Comment
Please, Sign In to add comment