mod com;
pub(crate) mod context;
mod document;
mod expressions;
mod extensions;
mod field_index;
mod interfaces;
mod lineage;
mod phases;
mod references;
mod semantics;
mod structural;
mod types;
pub use phases::ValidationPhase;
use crate::diagnostics::ValidationReport;
use crate::metadata;
use crate::model::TransformationContract;
use self::com::validate_com;
use self::context::ValidationContext;
use self::document::validate_document;
use self::expressions::validate_expressions;
use self::extensions::validate_extensions;
use self::interfaces::{
validate_condition_rule_phases, validate_condition_rule_refs, validate_io_extensions,
validate_optional_inputs,
};
use self::references::validate_references;
use self::semantics::validate_semantics;
use self::structural::validate_structural;
use self::types::validate_types;
#[must_use]
pub fn validate(contract: &TransformationContract) -> ValidationReport {
let mut ctx = ValidationContext::new();
for phase in ValidationPhase::ORDER {
match phase {
ValidationPhase::Document => {
validate_document(&mut ctx, contract);
merge_versioning(&mut ctx, contract);
}
ValidationPhase::CanonicalObjectModel => {
validate_com(&mut ctx, contract);
metadata::validate_into(&mut ctx, contract);
}
ValidationPhase::Structural => {
validate_structural(&mut ctx, contract);
validate_optional_inputs(&mut ctx, contract);
}
ValidationPhase::Types => {
validate_types(&mut ctx, contract);
validate_expressions(&mut ctx, contract);
}
ValidationPhase::References => {
validate_references(&mut ctx, contract);
validate_condition_rule_refs(&mut ctx, contract);
}
ValidationPhase::Semantics => {
validate_semantics(&mut ctx, contract);
validate_condition_rule_phases(&mut ctx, contract);
}
ValidationPhase::Extensions => {
validate_extensions(&mut ctx, contract);
validate_io_extensions(&mut ctx, contract);
}
}
}
ctx.into_report()
}
fn merge_versioning(ctx: &mut ValidationContext, contract: &TransformationContract) {
ctx.merge_report(crate::versioning::validate(contract));
}