mod dedup;
mod document;
mod extensions;
mod helpers;
mod ids;
mod json_schema;
mod phases;
mod quality;
mod references;
mod schema;
mod schema_index;
mod sections;
mod servers;
mod structural;
pub use phases::ValidationPhase;
pub use schema_index::{ContractIndex, SchemaIndex};
use crate::diagnostics::DiagnosticReport;
use crate::model::DataContract;
use crate::validation::schema_index::ContractIndex as ContractIndexType;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub struct ValidationOptions {
pub strict: bool,
}
impl ValidationOptions {
#[must_use]
pub const fn default_options() -> Self {
Self { strict: false }
}
#[must_use]
pub const fn strict() -> Self {
Self { strict: true }
}
}
fn run_validation_pipeline(
contract: &DataContract,
contract_index: Option<&ContractIndexType>,
) -> DiagnosticReport {
let mut report = DiagnosticReport::new();
report.merge(document::validate(contract));
report.merge(structural::validate(contract));
report.merge(schema::validate(contract));
report.merge(quality::validate(contract));
if contract_index.is_some() {
report.merge(references::validate_with_index(contract, contract_index));
} else {
report.merge(references::validate(contract));
}
report.merge(extensions::validate(contract));
report.merge(servers::validate(contract));
report.merge(sections::validate(contract));
report.merge(ids::validate(contract));
report.merge(json_schema::validate(contract));
dedup::dedup_json_schema_overlap(&mut report);
report
}
#[must_use]
pub fn validate(contract: &DataContract) -> DiagnosticReport {
validate_with_options(contract, ValidationOptions::default_options())
}
#[must_use]
pub fn validate_with_options(
contract: &DataContract,
_options: ValidationOptions,
) -> DiagnosticReport {
run_validation_pipeline(contract, None)
}
#[must_use]
pub fn validate_with_contract_index(
contract: &DataContract,
_options: ValidationOptions,
contract_index: Option<&ContractIndexType>,
) -> DiagnosticReport {
run_validation_pipeline(contract, contract_index)
}
#[must_use]
pub fn validate_strict(contract: &DataContract) -> DiagnosticReport {
validate(contract)
}