dtcs 0.3.0

Reference implementation of the Data Transformation Contract Standard (DTCS)
Documentation
//! Validation pipeline.

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;

/// Validate a transformation contract and collect diagnostics.
#[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));
}