automapper_validation/
pipeline.rs1use mig_assembly::assembler::{Assembler, AssemblerConfig};
6use mig_assembly::navigator::AssembledTreeNavigator;
7use mig_assembly::StructureDiagnosticKind;
8use mig_types::schema::mig::MigSchema;
9use mig_types::segment::OwnedSegment;
10
11use crate::eval::{ConditionEvaluator, ExternalConditionProvider};
12use crate::{
13 build_validated_tree, validate_unt_segment_count, AhbWorkflow, EdifactValidator, IssueKind,
14 Severity, ValidationIssue, ValidationLevel, ValidationReport,
15};
16
17pub fn validate_edifact_message<E: ConditionEvaluator>(
26 all_segments: &[OwnedSegment],
27 filtered_mig: &MigSchema,
28 workflow: &AhbWorkflow,
29 evaluator: E,
30 external: &dyn ExternalConditionProvider,
31 level: ValidationLevel,
32) -> ValidationReport {
33 validate_edifact_message_with_structure(
34 all_segments,
35 filtered_mig,
36 None,
37 workflow,
38 evaluator,
39 external,
40 level,
41 )
42}
43
44pub fn validate_edifact_message_with_structure<E: ConditionEvaluator>(
54 all_segments: &[OwnedSegment],
55 filtered_mig: &MigSchema,
56 pid_mig: Option<&MigSchema>,
57 workflow: &AhbWorkflow,
58 evaluator: E,
59 external: &dyn ExternalConditionProvider,
60 level: ValidationLevel,
61) -> ValidationReport {
62 let assembler = Assembler::with_config(
66 filtered_mig,
67 AssemblerConfig {
68 strict_code_matching: true,
69 skip_unknown_segments: true,
70 ..Default::default()
71 },
72 );
73 let (tree, mut structure_diagnostics) = assembler.assemble_with_diagnostics(all_segments);
74 if let Some(pid_mig) = pid_mig {
75 structure_diagnostics.extend(mig_assembly::structure_check::check_structure(
76 &tree, pid_mig,
77 ));
78 }
79
80 let validated_tree = build_validated_tree(workflow, &tree);
81 let navigator = AssembledTreeNavigator::new(&tree);
82 let validator = EdifactValidator::new(evaluator);
83 let mut report = validator.validate_tree(
84 &validated_tree,
85 all_segments,
86 external,
87 level,
88 Some(&navigator),
89 );
90
91 if let Some(issue) = validate_unt_segment_count(all_segments) {
92 report.add_issue(issue);
93 }
94
95 for diag in structure_diagnostics {
96 let severity = match diag.kind {
100 StructureDiagnosticKind::MissingRequiredSegment
101 | StructureDiagnosticKind::MissingRequiredGroup => Severity::Error,
102 _ => Severity::Warning,
103 };
104 let kind = IssueKind::StructureDiagnostic {
105 kind: diag.kind,
106 segment_id: diag.segment_id.clone(),
107 position: diag.position,
108 detail: diag.message,
109 };
110 report.add_issue(ValidationIssue::new(severity, kind));
111 }
112
113 report
114}