use crate::errors::diagnostic::{codes, Diagnostic};
use crate::model::EvalConfig;
use crate::model::Policy;
use std::collections::{HashMap, HashSet};
pub fn analyze_policy_usage(
_cfg: &EvalConfig,
policies: &HashMap<String, Policy>,
diags: &mut Vec<Diagnostic>,
) {
for (path, policy) in policies {
let mut tool_names: HashSet<String> = HashSet::new();
if let Some(allow) = &policy.tools.allow {
for t in allow {
tool_names.insert(t.clone());
}
}
if let Some(constraints) = &policy.tools.arg_constraints {
for t in constraints.keys() {
tool_names.insert(t.clone());
}
}
for (alias, targets) in &policy.aliases {
if tool_names.contains(alias) {
diags.push(
Diagnostic::new(
codes::E_CFG_SCHEMA,
format!("Alias '{}' shadows an explicit tool name.", alias),
)
.with_severity("warn")
.with_source("doctor.policy_analysis")
.with_context(serde_json::json!({
"policy_file": path,
"alias": alias,
"targets": targets
}))
.with_fix_step(format!("Rename alias '{}' to avoid confusion.", alias)),
);
}
}
}
}