Skip to main content

automapper_validation/validator/
codes.rs

1//! Standard error codes for validation issues.
2//!
3//! Error codes follow a prefix convention:
4//! - `STR0xx`: Structure validation
5//! - `FMT0xx`: Format validation
6//! - `COD0xx`: Code value validation
7//! - `AHB0xx`: AHB condition rule validation
8
9/// Standard error codes for validation issues.
10pub struct ErrorCodes;
11
12impl ErrorCodes {
13    // --- Structure validation (STR001-STR099) ---
14
15    /// A mandatory segment is missing.
16    pub const MISSING_MANDATORY_SEGMENT: &'static str = "STR001";
17
18    /// Segment repetitions exceed the MIG MaxRep count.
19    pub const MAX_REPETITIONS_EXCEEDED: &'static str = "STR002";
20
21    /// Unexpected segment found (not defined in MIG for this message type).
22    pub const UNEXPECTED_SEGMENT: &'static str = "STR003";
23
24    /// Segments are in wrong order according to the MIG.
25    pub const WRONG_SEGMENT_ORDER: &'static str = "STR004";
26
27    /// A mandatory segment group is missing.
28    pub const MISSING_MANDATORY_GROUP: &'static str = "STR005";
29
30    /// Segment group repetitions exceed MaxRep count.
31    pub const GROUP_MAX_REP_EXCEEDED: &'static str = "STR006";
32
33    /// UNT segment count does not match the actual number of segments.
34    pub const UNT_SEGMENT_COUNT_MISMATCH: &'static str = "STR007";
35
36    // --- Format validation (FMT001-FMT099) ---
37
38    /// Value exceeds maximum allowed length.
39    pub const VALUE_TOO_LONG: &'static str = "FMT001";
40
41    /// Value does not match required numeric format.
42    pub const INVALID_NUMERIC_FORMAT: &'static str = "FMT002";
43
44    /// Value does not match required alphanumeric format.
45    pub const INVALID_ALPHANUMERIC_FORMAT: &'static str = "FMT003";
46
47    /// Invalid date/time format.
48    pub const INVALID_DATE_FORMAT: &'static str = "FMT004";
49
50    /// Value is shorter than minimum required length.
51    pub const VALUE_TOO_SHORT: &'static str = "FMT005";
52
53    /// A required element is empty.
54    pub const REQUIRED_ELEMENT_EMPTY: &'static str = "FMT006";
55
56    // --- Code validation (COD001-COD099) ---
57
58    /// Code value is not in the allowed code list for this element.
59    pub const INVALID_CODE_VALUE: &'static str = "COD001";
60
61    /// Code value is not allowed for this specific Pruefidentifikator.
62    pub const CODE_NOT_ALLOWED_FOR_PID: &'static str = "COD002";
63
64    // --- AHB validation (AHB001-AHB999) ---
65
66    /// A field required by the AHB for this PID is missing.
67    pub const MISSING_REQUIRED_FIELD: &'static str = "AHB001";
68
69    /// A field is present but not allowed by the AHB for this PID.
70    pub const FIELD_NOT_ALLOWED_FOR_PID: &'static str = "AHB002";
71
72    /// A conditional AHB rule is violated.
73    pub const CONDITIONAL_RULE_VIOLATION: &'static str = "AHB003";
74
75    /// The Pruefidentifikator is unknown / not supported.
76    pub const UNKNOWN_PRUEFIDENTIFIKATOR: &'static str = "AHB004";
77
78    /// A condition expression could not be fully evaluated (Unknown result).
79    pub const CONDITION_UNKNOWN: &'static str = "AHB005";
80
81    /// Package cardinality constraint violated: count of present codes outside [min..max].
82    pub const PACKAGE_CARDINALITY_VIOLATION: &'static str = "AHB006";
83}
84
85#[cfg(test)]
86mod tests {
87    use super::*;
88
89    #[test]
90    fn test_error_code_prefixes() {
91        assert!(ErrorCodes::MISSING_MANDATORY_SEGMENT.starts_with("STR"));
92        assert!(ErrorCodes::VALUE_TOO_LONG.starts_with("FMT"));
93        assert!(ErrorCodes::INVALID_CODE_VALUE.starts_with("COD"));
94        assert!(ErrorCodes::MISSING_REQUIRED_FIELD.starts_with("AHB"));
95    }
96
97    #[test]
98    fn test_all_codes_are_unique() {
99        let codes = [
100            ErrorCodes::MISSING_MANDATORY_SEGMENT,
101            ErrorCodes::MAX_REPETITIONS_EXCEEDED,
102            ErrorCodes::UNEXPECTED_SEGMENT,
103            ErrorCodes::WRONG_SEGMENT_ORDER,
104            ErrorCodes::MISSING_MANDATORY_GROUP,
105            ErrorCodes::GROUP_MAX_REP_EXCEEDED,
106            ErrorCodes::UNT_SEGMENT_COUNT_MISMATCH,
107            ErrorCodes::VALUE_TOO_LONG,
108            ErrorCodes::INVALID_NUMERIC_FORMAT,
109            ErrorCodes::INVALID_ALPHANUMERIC_FORMAT,
110            ErrorCodes::INVALID_DATE_FORMAT,
111            ErrorCodes::VALUE_TOO_SHORT,
112            ErrorCodes::REQUIRED_ELEMENT_EMPTY,
113            ErrorCodes::INVALID_CODE_VALUE,
114            ErrorCodes::CODE_NOT_ALLOWED_FOR_PID,
115            ErrorCodes::MISSING_REQUIRED_FIELD,
116            ErrorCodes::FIELD_NOT_ALLOWED_FOR_PID,
117            ErrorCodes::CONDITIONAL_RULE_VIOLATION,
118            ErrorCodes::UNKNOWN_PRUEFIDENTIFIKATOR,
119            ErrorCodes::CONDITION_UNKNOWN,
120            ErrorCodes::PACKAGE_CARDINALITY_VIOLATION,
121        ];
122
123        let unique: std::collections::HashSet<&str> = codes.iter().copied().collect();
124        assert_eq!(codes.len(), unique.len(), "Duplicate error codes found");
125    }
126}