use crate::contract_drift::types::{DriftBudget, DriftBudgetConfig};
pub(super) fn budget_for(
config: &DriftBudgetConfig,
endpoint: &str,
method: &str,
workspace_id: Option<&str>,
service_name: Option<&str>,
tags: Option<&[String]>,
) -> DriftBudget {
if let Some(workspace_id) = workspace_id {
if let Some(budget) = config.per_workspace_budgets.get(workspace_id) {
return budget.clone();
}
}
if let Some(service_name) = service_name {
if let Some(budget) = config.per_service_budgets.get(service_name) {
return budget.clone();
}
}
if let Some(tags) = tags {
for tag in tags {
if let Some(budget) = config.per_tag_budgets.get(tag) {
return budget.clone();
}
if let Some(budget) = config.per_service_budgets.get(tag) {
return budget.clone();
}
}
}
let key = format!("{} {}", method, endpoint);
if let Some(budget) = config.per_endpoint_budgets.get(&key) {
return budget.clone();
}
config.default_budget.clone().unwrap_or_default()
}