Skip to main content

workshop_rs/rules/
validate.rs

1//! Complete-program canonical validation orchestrated by the Workshop rule
2//! domain.
3
4use crate::catalog::Catalog;
5use crate::core::error::Result;
6use crate::wir;
7
8/// Validate every builtin reference in a Workshop-origin WIR program against
9/// the canonical catalog: action/value call names must be known canonical ids,
10/// and event/enum references must resolve to canonical identities.
11pub fn validate_canonical_ids(program: &crate::Program, catalog: &Catalog) -> Result<()> {
12    let storage = program.to_wir()?;
13    validate_wir(&storage, catalog)
14}
15
16#[doc(hidden)]
17pub fn validate_canonical_ids_wir(program: &wir::Program, catalog: &Catalog) -> Result<()> {
18    validate_wir(program, catalog)
19}
20
21pub(crate) fn validate_wir(program: &wir::Program, catalog: &Catalog) -> Result<()> {
22    for (index, _) in program.rules.iter().enumerate() {
23        let rule = wir::RuleId::from_index(index);
24        let Some(rule_data) = program.rules.get(rule) else {
25            continue;
26        };
27        crate::events::validate::validate_event(&rule_data.event, rule_data.span, catalog)?;
28        for action in &rule_data.actions {
29            crate::actions::validate::validate_action(program, catalog, *action)?;
30        }
31        for condition in &rule_data.conditions {
32            crate::values::validate::validate_value(program, catalog, *condition)?;
33        }
34    }
35    Ok(())
36}