use crate::catalog::Catalog;
use crate::core::error::Result;
use crate::wir;
pub fn validate_canonical_ids(program: &crate::Program, catalog: &Catalog) -> Result<()> {
let storage = program.to_wir()?;
validate_wir(&storage, catalog)
}
#[doc(hidden)]
pub fn validate_canonical_ids_wir(program: &wir::Program, catalog: &Catalog) -> Result<()> {
validate_wir(program, catalog)
}
pub(crate) fn validate_wir(program: &wir::Program, catalog: &Catalog) -> Result<()> {
let mut errors = Vec::new();
for (index, _) in program.rules.iter().enumerate() {
let rule = wir::RuleId::from_index(index);
let Some(rule_data) = program.rules.get(rule) else {
continue;
};
crate::events::validate::validate_event(
&rule_data.event,
rule_data.span,
catalog,
&mut errors,
);
for action in &rule_data.actions {
crate::actions::validate::validate_action(program, catalog, *action, &mut errors);
}
for condition in &rule_data.conditions {
crate::values::validate::validate_value(program, catalog, *condition, &mut errors);
}
}
errors.into_iter().next().map_or(Ok(()), Err)
}