use crate::{ models::{budget::Budget, category_budget::CategoryBudget}, queries::{ budget_updates::{ get_first_budget_update_with_date, get_most_recent_budget_update_date_with_category_id, }, categories::get_all_category_ids, }, }; use diesel::{result::Error, SqliteConnection}; pub fn get_all_category_budgets( connection: &mut SqliteConnection, ) -> Result, Error> { let category_ids: Vec = get_all_category_ids(connection)?; let mut budgets = Vec::::new(); for category_id in category_ids { let most_recent_budget_update_date = get_most_recent_budget_update_date_with_category_id(category_id, connection)?; if most_recent_budget_update_date.is_none() { budgets.push(CategoryBudget { category_id, budget: Option::None, }); continue; } let most_recent_budget_update = get_first_budget_update_with_date( most_recent_budget_update_date.unwrap().as_str(), connection, )?; budgets.push(CategoryBudget { category_id, budget: Some(Budget::from(&most_recent_budget_update)), }); } Ok(budgets) }