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 validate_message(
63 all_segments,
64 filtered_mig,
65 pid_mig,
66 workflow,
67 EdifactValidator::new(evaluator),
68 external,
69 level,
70 )
71}
72
73pub fn validate_edifact_message_reporting_segments<E: ConditionEvaluator>(
79 all_segments: &[OwnedSegment],
80 filtered_mig: &MigSchema,
81 workflow: &AhbWorkflow,
82 evaluator: E,
83 external: &dyn ExternalConditionProvider,
84 level: ValidationLevel,
85) -> ValidationReport {
86 validate_message(
87 all_segments,
88 filtered_mig,
89 None,
90 workflow,
91 EdifactValidator::new(evaluator).reporting_segments(),
92 external,
93 level,
94 )
95}
96
97fn validate_message<E: ConditionEvaluator>(
98 all_segments: &[OwnedSegment],
99 filtered_mig: &MigSchema,
100 pid_mig: Option<&MigSchema>,
101 workflow: &AhbWorkflow,
102 validator: EdifactValidator<E>,
103 external: &dyn ExternalConditionProvider,
104 level: ValidationLevel,
105) -> ValidationReport {
106 let assembler = Assembler::with_config(
110 filtered_mig,
111 AssemblerConfig {
112 strict_code_matching: true,
113 skip_unknown_segments: true,
114 ..Default::default()
115 },
116 );
117 let (tree, mut structure_diagnostics) = assembler.assemble_with_diagnostics(all_segments);
118 if let Some(pid_mig) = pid_mig {
119 structure_diagnostics.extend(mig_assembly::structure_check::check_structure(
120 &tree, pid_mig,
121 ));
122 }
123
124 let validated_tree = build_validated_tree(workflow, &tree);
125 let navigator = AssembledTreeNavigator::new(&tree);
126 let mut report = validator.validate_tree(
127 &validated_tree,
128 all_segments,
129 external,
130 level,
131 Some(&navigator),
132 );
133
134 if let Some(issue) = validate_unt_segment_count(all_segments) {
135 report.add_issue(issue);
136 }
137
138 for diag in structure_diagnostics {
139 let severity = match diag.kind {
143 StructureDiagnosticKind::MissingRequiredSegment
144 | StructureDiagnosticKind::MissingRequiredGroup => Severity::Error,
145 _ => Severity::Warning,
146 };
147 let kind = IssueKind::StructureDiagnostic {
148 kind: diag.kind,
149 segment_id: diag.segment_id.clone(),
150 position: diag.position,
151 detail: diag.message,
152 };
153 report.add_issue(ValidationIssue::new(severity, kind));
154 }
155
156 report
157}