use std::collections::HashMap; use actualbudget_models::{ActualbudgetAccount, ActualbudgetPayee}; use anyhow::Context; use super::{account_names::ACCOUNT_NAMES_DICT, payee_names::PAYEE_NAMES_DICT}; pub fn get_payee_matchers( ) -> Vec) -> bool>> { vec![ Box::new(|p, a| matches_bank_account_transfer_account(p, a)), Box::new(|p, a| matches_cash_account_transfer_account(p, a)), Box::new(|p, a| matches_category_transfers_transfer_account(p, a)), Box::new(|p, a| matches_starting_balances(p, a)), Box::new(|p, a| matches_employer(p, a)), Box::new(|p, a| matches_tesco(p, a)), ] } fn matches_bank_account_transfer_account( payee: &ActualbudgetPayee, accounts: &HashMap, ) -> bool { let bank_account = accounts .get(ACCOUNT_NAMES_DICT.bank_account) .with_context(|| "failed to get bank account") .unwrap(); match payee { ActualbudgetPayee { name, transfer_account_id, .. } => name == "" && transfer_account_id.clone().is_some_and( |account_id| account_id == bank_account.id, ), } } fn matches_cash_account_transfer_account( payee: &ActualbudgetPayee, accounts: &HashMap, ) -> bool { let cash_account = accounts .get(ACCOUNT_NAMES_DICT.cash_account) .with_context(|| "failed to find cash account") .unwrap(); match payee { ActualbudgetPayee { name, transfer_account_id, .. } => name == "" && transfer_account_id.clone().is_some_and( |account_id| account_id == cash_account.id, ), } } fn matches_category_transfers_transfer_account( payee: &ActualbudgetPayee, accounts: &HashMap, ) -> bool { let category_transfers_account = accounts .get(ACCOUNT_NAMES_DICT.transfers_account) .with_context(|| "failed to find category transfers account") .unwrap(); match payee { ActualbudgetPayee { name, transfer_account_id, .. } => name == "" && transfer_account_id.clone().is_some_and( |account_id| account_id == category_transfers_account.id, ), } } fn matches_starting_balances( payee: &ActualbudgetPayee, _accounts: &HashMap, ) -> bool { match payee { ActualbudgetPayee { name, transfer_account_id, .. } => transfer_account_id.is_none() && name.clone() == PAYEE_NAMES_DICT.starting_balances, } } fn matches_employer( payee: &ActualbudgetPayee, _accounts: &HashMap, ) -> bool { match payee { ActualbudgetPayee { name, transfer_account_id, .. } => transfer_account_id.is_none() && name == PAYEE_NAMES_DICT.employer, } } fn matches_tesco( payee: &ActualbudgetPayee, _accounts: &HashMap, ) -> bool { match payee { ActualbudgetPayee { name, transfer_account_id, .. } => transfer_account_id.is_none() && name == PAYEE_NAMES_DICT.tesco, } }