automapper_validation/
pipeline.rs1use mig_assembly::assembler::{Assembler, AssemblerConfig};
6use mig_assembly::StructureDiagnosticKind;
7use mig_types::schema::mig::MigSchema;
8use mig_types::segment::OwnedSegment;
9
10use crate::eval::{ConditionEvaluator, ExternalConditionProvider};
11use crate::{
12 build_validated_tree, validate_unt_segment_count, AhbWorkflow, EdifactValidator, IssueKind,
13 Severity, ValidationIssue, ValidationLevel, ValidationReport,
14};
15
16pub fn validate_edifact_message<E: ConditionEvaluator>(
25 all_segments: &[OwnedSegment],
26 filtered_mig: &MigSchema,
27 workflow: &AhbWorkflow,
28 evaluator: E,
29 external: &dyn ExternalConditionProvider,
30 level: ValidationLevel,
31) -> ValidationReport {
32 validate_edifact_message_with_structure(
33 all_segments,
34 filtered_mig,
35 None,
36 workflow,
37 evaluator,
38 external,
39 level,
40 )
41}
42
43pub fn validate_edifact_message_with_structure<E: ConditionEvaluator>(
53 all_segments: &[OwnedSegment],
54 filtered_mig: &MigSchema,
55 pid_mig: Option<&MigSchema>,
56 workflow: &AhbWorkflow,
57 evaluator: E,
58 external: &dyn ExternalConditionProvider,
59 level: ValidationLevel,
60) -> ValidationReport {
61 validate_message(
62 all_segments,
63 filtered_mig,
64 pid_mig,
65 workflow,
66 EdifactValidator::new(evaluator),
67 external,
68 level,
69 )
70}
71
72pub fn validate_edifact_message_reporting_segments<E: ConditionEvaluator>(
78 all_segments: &[OwnedSegment],
79 filtered_mig: &MigSchema,
80 workflow: &AhbWorkflow,
81 evaluator: E,
82 external: &dyn ExternalConditionProvider,
83 level: ValidationLevel,
84) -> ValidationReport {
85 validate_message(
86 all_segments,
87 filtered_mig,
88 None,
89 workflow,
90 EdifactValidator::new(evaluator).reporting_segments(),
91 external,
92 level,
93 )
94}
95
96fn validate_message<E: ConditionEvaluator>(
97 all_segments: &[OwnedSegment],
98 filtered_mig: &MigSchema,
99 pid_mig: Option<&MigSchema>,
100 workflow: &AhbWorkflow,
101 validator: EdifactValidator<E>,
102 external: &dyn ExternalConditionProvider,
103 level: ValidationLevel,
104) -> ValidationReport {
105 let assembler = Assembler::with_config(
109 filtered_mig,
110 AssemblerConfig {
111 strict_code_matching: true,
112 skip_unknown_segments: true,
113 ..Default::default()
114 },
115 );
116 let (tree, mut structure_diagnostics) = assembler.assemble_with_diagnostics(all_segments);
117 if let Some(pid_mig) = pid_mig {
118 structure_diagnostics.extend(mig_assembly::structure_check::check_structure(
119 &tree, pid_mig,
120 ));
121 }
122
123 let validated_tree = build_validated_tree(workflow, &tree);
124 let mut report =
125 validator.validate_assembled_tree(&validated_tree, all_segments, external, level, &tree);
126
127 if let Some(issue) = validate_unt_segment_count(all_segments) {
128 report.add_issue(issue);
129 }
130
131 for diag in structure_diagnostics {
132 let severity = match diag.kind {
137 StructureDiagnosticKind::MissingRequiredSegment
138 | StructureDiagnosticKind::MissingRequiredGroup
139 | StructureDiagnosticKind::MaxRepetitionsExceeded
140 | StructureDiagnosticKind::GroupMaxRepetitionsExceeded => Severity::Error,
141 _ => Severity::Warning,
142 };
143 let kind = IssueKind::StructureDiagnostic {
144 kind: diag.kind,
145 segment_id: diag.segment_id.clone(),
146 position: diag.position,
147 detail: diag.message,
148 };
149 report.add_issue(ValidationIssue::new(severity, kind));
150 }
151
152 report
153}