use mig_assembly::assembler::{Assembler, AssemblerConfig};
use mig_assembly::navigator::AssembledTreeNavigator;
use mig_types::schema::mig::MigSchema;
use mig_types::segment::OwnedSegment;
use crate::eval::{ConditionEvaluator, ExternalConditionProvider};
use crate::{
build_validated_tree, validate_unt_segment_count, AhbWorkflow, EdifactValidator, IssueKind,
Severity, ValidationIssue, ValidationLevel, ValidationReport,
};
pub fn validate_edifact_message<E: ConditionEvaluator>(
all_segments: &[OwnedSegment],
filtered_mig: &MigSchema,
workflow: &AhbWorkflow,
evaluator: E,
external: &dyn ExternalConditionProvider,
level: ValidationLevel,
) -> ValidationReport {
let assembler = Assembler::with_config(
filtered_mig,
AssemblerConfig {
strict_code_matching: true,
skip_unknown_segments: true,
..Default::default()
},
);
let (tree, structure_diagnostics) = assembler.assemble_with_diagnostics(all_segments);
let validated_tree = build_validated_tree(workflow, &tree);
let navigator = AssembledTreeNavigator::new(&tree);
let validator = EdifactValidator::new(evaluator);
let mut report = validator.validate_tree(
&validated_tree,
all_segments,
external,
level,
Some(&navigator),
);
if let Some(issue) = validate_unt_segment_count(all_segments) {
report.add_issue(issue);
}
for diag in structure_diagnostics {
let kind = IssueKind::StructureDiagnostic {
kind: diag.kind,
segment_id: diag.segment_id.clone(),
position: diag.position,
detail: diag.message,
};
report.add_issue(ValidationIssue::new(Severity::Warning, kind));
}
report
}