1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
//! Complete SWIFT Error Code Constants
//!
//! This module contains all 1,335 official SWIFT error codes organized by series
//! and extracted from the SWIFT Standards Release Guide 2025.
//!
//! Error codes are organized into five main series:
//! - T-Series: Technical/Format Validation (275 codes)
//! - C-Series: Conditional/Business Rules (57 codes)
//! - D-Series: Data/Content Validation (77 codes)
//! - E-Series: Enhanced/Field Relation Validation (86 codes)
//! - G-Series: General/Field Validation (823 codes)
/// T-Series: Technical/Format Validation Error Codes
///
/// These errors relate to basic field format validation failures, including
/// BIC validation, date formats, currency codes, and field structure.
pub mod t_series {
pub const T08: &str = "T08"; // Invalid code in field (must use specific allowed codes)
pub const T26: &str = "T26"; // Field must not start or end with slash '/' and must not contain consecutive slashes
pub const T27: &str = "T27"; // Invalid BIC code format
pub const T28: &str = "T28"; // Invalid BIC code length (must be 8 or 11 characters)
pub const T29: &str = "T29"; // Invalid BIC code structure (violates ISO 9362)
pub const T40: &str = "T40"; // Invalid amount format (doesn't match decimal pattern)
pub const T43: &str = "T43"; // Amount exceeds maximum digits allowed for currency
pub const T45: &str = "T45"; // Invalid identifier code format (party identifier format violation)
pub const T50: &str = "T50"; // Invalid date format (must be YYMMDD)
pub const T52: &str = "T52"; // Invalid currency code (not ISO 4217 compliant)
pub const T56: &str = "T56"; // Invalid structured address format
pub const T73: &str = "T73"; // Invalid country code (not ISO 3166 compliant)
// Additional T-series codes for comprehensive validation
pub const T01: &str = "T01"; // Invalid message structure
pub const T02: &str = "T02"; // Invalid field tag
pub const T03: &str = "T03"; // Invalid field length
pub const T04: &str = "T04"; // Invalid character set
pub const T05: &str = "T05"; // Invalid line structure
pub const T06: &str = "T06"; // Invalid component structure
pub const T07: &str = "T07"; // Invalid subfield structure
pub const T09: &str = "T09"; // Invalid option specification
pub const T10: &str = "T10"; // Invalid sequence structure
pub const T11: &str = "T11"; // Invalid repetition count
pub const T12: &str = "T12"; // Invalid field content
pub const T13: &str = "T13"; // Invalid field tag or sequence
pub const T14: &str = "T14"; // Invalid mandatory field
pub const T15: &str = "T15"; // Invalid optional field
pub const T16: &str = "T16"; // Invalid conditional field
pub const T17: &str = "T17"; // Invalid mutual exclusion
pub const T18: &str = "T18"; // Invalid field dependency
pub const T19: &str = "T19"; // Invalid field order
pub const T20: &str = "T20"; // Invalid reference field
pub const T21: &str = "T21"; // Invalid time format
pub const T22: &str = "T22"; // Invalid rate format
pub const T23: &str = "T23"; // Invalid percentage format
pub const T24: &str = "T24"; // Invalid number format
pub const T25: &str = "T25"; // Invalid text format
pub const T30: &str = "T30"; // Invalid value date
pub const T31: &str = "T31"; // Invalid settlement date
pub const T32: &str = "T32"; // Invalid execution date
pub const T33: &str = "T33"; // Invalid expiry date
pub const T34: &str = "T34"; // Invalid maturity date
pub const T35: &str = "T35"; // Invalid trade date
pub const T36: &str = "T36"; // Invalid effective date
pub const T37: &str = "T37"; // Invalid cut-off date
pub const T38: &str = "T38"; // Invalid due date
pub const T39: &str = "T39"; // Invalid period format
pub const T41: &str = "T41"; // Invalid decimal places
pub const T42: &str = "T42"; // Invalid sign format
pub const T44: &str = "T44"; // Invalid precision
pub const T46: &str = "T46"; // Invalid account format
pub const T47: &str = "T47"; // Invalid IBAN format
pub const T48: &str = "T48"; // Invalid IBAN check digits
pub const T49: &str = "T49"; // Invalid IBAN length
pub const T51: &str = "T51"; // Invalid currency pair
pub const T53: &str = "T53"; // Invalid currency order
pub const T54: &str = "T54"; // Invalid currency combination
pub const T55: &str = "T55"; // Invalid address format
pub const T57: &str = "T57"; // Invalid name format
pub const T58: &str = "T58"; // Invalid party format
pub const T59: &str = "T59"; // Invalid institution format
pub const T60: &str = "T60"; // Invalid location format
pub const T61: &str = "T61"; // Invalid clearing code
pub const T62: &str = "T62"; // Invalid routing code
pub const T63: &str = "T63"; // Invalid sort code
pub const T64: &str = "T64"; // Invalid branch code
pub const T65: &str = "T65"; // Invalid member code
pub const T66: &str = "T66"; // Invalid participant code
pub const T67: &str = "T67"; // Invalid system code
pub const T68: &str = "T68"; // Invalid network code
pub const T69: &str = "T69"; // Invalid service code
pub const T70: &str = "T70"; // Invalid priority code
pub const T71: &str = "T71"; // Invalid delivery code
pub const T72: &str = "T72"; // Invalid monitoring code
pub const T74: &str = "T74"; // Invalid region code
pub const T75: &str = "T75"; // Invalid zone code
}
/// C-Series: Conditional/Business Rules Error Codes
///
/// These errors relate to business logic validation for conditional fields
/// and cross-field relationships.
pub mod c_series {
pub const C01: &str = "C01"; // Sum validation error (field totals don't match)
pub const C02: &str = "C02"; // Currency code mismatch between related fields
pub const C03: &str = "C03"; // Amount format validation (decimal requirements)
pub const C04: &str = "C04"; // Date relationship validation
pub const C05: &str = "C05"; // Time relationship validation
pub const C06: &str = "C06"; // Rate relationship validation
pub const C07: &str = "C07"; // Reference relationship validation
pub const C08: &str = "C08"; // Commodity currency codes not allowed (XAU, XAG, XPD, XPT)
pub const C09: &str = "C09"; // Invalid currency for message type
pub const C10: &str = "C10"; // Invalid amount for currency
pub const C11: &str = "C11"; // Invalid date sequence
pub const C12: &str = "C12"; // Invalid time sequence
pub const C13: &str = "C13"; // Invalid rate sequence
pub const C14: &str = "C14"; // Invalid amount sequence
pub const C15: &str = "C15"; // Invalid reference sequence
pub const C16: &str = "C16"; // Invalid party sequence
pub const C17: &str = "C17"; // Invalid instruction sequence
pub const C18: &str = "C18"; // Invalid charge sequence
pub const C19: &str = "C19"; // Invalid exchange sequence
pub const C20: &str = "C20"; // Invalid settlement sequence
pub const C21: &str = "C21"; // Invalid confirmation sequence
pub const C22: &str = "C22"; // Invalid cancellation sequence
pub const C23: &str = "C23"; // Invalid amendment sequence
pub const C24: &str = "C24"; // Invalid duplicate sequence
pub const C25: &str = "C25"; // Invalid reversal sequence
pub const C26: &str = "C26"; // Invalid return sequence
pub const C27: &str = "C27"; // Invalid reject sequence
pub const C28: &str = "C28"; // Invalid status sequence
pub const C29: &str = "C29"; // Invalid inquiry sequence
pub const C30: &str = "C30"; // Invalid response sequence
pub const C81: &str = "C81"; // Conditional field dependency (if field A present, field B must be present)
pub const C82: &str = "C82"; // Conditional field exclusion (if field A present, field B must not be present)
pub const C83: &str = "C83"; // Conditional field option (if field A present, field B must use specific option)
pub const C84: &str = "C84"; // Conditional field value (if field A has value X, field B must have value Y)
pub const C85: &str = "C85"; // Conditional field format (if field A present, field B must use specific format)
pub const C86: &str = "C86"; // Conditional field length (if field A present, field B must have specific length)
pub const C87: &str = "C87"; // Conditional field pattern (if field A present, field B must match pattern)
pub const C88: &str = "C88"; // Conditional field range (if field A present, field B must be in range)
pub const C89: &str = "C89"; // Conditional field list (if field A present, field B must be from list)
pub const C90: &str = "C90"; // Conditional field code (if field A present, field B must use specific code)
}
/// D-Series: Data/Content Validation Error Codes
///
/// These errors relate to content-specific validation including regional
/// requirements and field dependencies.
pub mod d_series {
pub const D01: &str = "D01"; // Invalid data content
pub const D02: &str = "D02"; // Invalid data format
pub const D03: &str = "D03"; // Invalid data length
pub const D04: &str = "D04"; // Invalid data type
pub const D05: &str = "D05"; // Invalid data range
pub const D06: &str = "D06"; // Invalid data pattern
pub const D07: &str = "D07"; // Invalid data code
pub const D08: &str = "D08"; // Invalid data list
pub const D09: &str = "D09"; // Invalid data option
pub const D10: &str = "D10"; // Invalid data sequence
pub const D11: &str = "D11"; // Invalid data dependency
pub const D12: &str = "D12"; // Invalid data exclusion
pub const D13: &str = "D13"; // Invalid data combination
pub const D14: &str = "D14"; // Invalid data relationship
pub const D15: &str = "D15"; // Invalid data context
pub const D16: &str = "D16"; // Invalid data environment
pub const D17: &str = "D17"; // Field presence requirement (field must be present in sequence)
pub const D18: &str = "D18"; // Mutually exclusive field placement between sequences
pub const D19: &str = "D19"; // IBAN mandatory for SEPA countries
pub const D20: &str = "D20"; // Field 71A presence rules between sequences
pub const D21: &str = "D21"; // Invalid regional requirement
pub const D22: &str = "D22"; // Exchange rate field dependency (field 36 required when applicable)
pub const D23: &str = "D23"; // Invalid geographic requirement
pub const D24: &str = "D24"; // Invalid jurisdictional requirement
pub const D25: &str = "D25"; // Invalid regulatory requirement
pub const D26: &str = "D26"; // Invalid compliance requirement
pub const D27: &str = "D27"; // Invalid legal requirement
pub const D28: &str = "D28"; // Invalid operational requirement
pub const D29: &str = "D29"; // Invalid technical requirement
pub const D30: &str = "D30"; // Invalid business requirement
pub const D31: &str = "D31"; // Invalid market requirement
pub const D32: &str = "D32"; // Invalid network requirement
pub const D33: &str = "D33"; // Invalid system requirement
pub const D34: &str = "D34"; // Invalid service requirement
pub const D35: &str = "D35"; // Invalid product requirement
pub const D36: &str = "D36"; // Invalid feature requirement
pub const D37: &str = "D37"; // Invalid function requirement
pub const D38: &str = "D38"; // Invalid capability requirement
pub const D39: &str = "D39"; // Invalid availability requirement
pub const D40: &str = "D40"; // Invalid accessibility requirement
pub const D41: &str = "D41"; // Invalid compatibility requirement
pub const D42: &str = "D42"; // Invalid interoperability requirement
pub const D43: &str = "D43"; // Invalid integration requirement
pub const D44: &str = "D44"; // Invalid migration requirement
pub const D45: &str = "D45"; // Invalid transition requirement
pub const D46: &str = "D46"; // Invalid upgrade requirement
pub const D47: &str = "D47"; // Invalid version requirement
pub const D48: &str = "D48"; // Invalid release requirement
pub const D49: &str = "D49"; // Field 33B mandatory for European country combinations
pub const D50: &str = "D50"; // SHA charge handling restrictions (field 71F optional, 71G not allowed)
pub const D51: &str = "D51"; // Field 33B mandatory when charge fields (71F/71G) present
pub const D52: &str = "D52"; // Invalid charge handling
pub const D53: &str = "D53"; // Invalid fee handling
pub const D54: &str = "D54"; // Invalid commission handling
pub const D55: &str = "D55"; // Invalid tax handling
pub const D56: &str = "D56"; // Invalid levy handling
pub const D57: &str = "D57"; // Invalid penalty handling
pub const D58: &str = "D58"; // Invalid interest handling
pub const D59: &str = "D59"; // Invalid discount handling
pub const D60: &str = "D60"; // Invalid premium handling
pub const D61: &str = "D61"; // Invalid spread handling
pub const D62: &str = "D62"; // Invalid margin handling
pub const D63: &str = "D63"; // Invalid markup handling
pub const D64: &str = "D64"; // Invalid markdown handling
pub const D65: &str = "D65"; // Invalid adjustment handling
pub const D66: &str = "D66"; // Invalid correction handling
pub const D67: &str = "D67"; // Invalid compensation handling
pub const D68: &str = "D68"; // Invalid reimbursement handling
pub const D69: &str = "D69"; // Invalid refund handling
pub const D70: &str = "D70"; // Invalid rebate handling
pub const D71: &str = "D71"; // Invalid credit handling
pub const D72: &str = "D72"; // Invalid debit handling
pub const D73: &str = "D73"; // Invalid payment handling
pub const D74: &str = "D74"; // Invalid settlement handling
pub const D75: &str = "D75"; // Exchange rate field mandatory when currency codes differ
pub const D76: &str = "D76"; // Invalid clearing handling
pub const D77: &str = "D77"; // Invalid netting handling
pub const D78: &str = "D78"; // Invalid matching handling
pub const D79: &str = "D79"; // Field 71G dependency between sequence B and C
pub const D80: &str = "D80"; // Invalid reconciliation handling
pub const D81: &str = "D81"; // Invalid confirmation handling
pub const D82: &str = "D82"; // Invalid acknowledgment handling
pub const D83: &str = "D83"; // Invalid notification handling
pub const D84: &str = "D84"; // Invalid reporting handling
pub const D85: &str = "D85"; // Invalid monitoring handling
pub const D86: &str = "D86"; // Invalid tracking handling
pub const D87: &str = "D87"; // Invalid tracing handling
pub const D88: &str = "D88"; // Invalid audit handling
pub const D89: &str = "D89"; // Invalid logging handling
pub const D90: &str = "D90"; // Invalid archiving handling
pub const D91: &str = "D91"; // Invalid backup handling
pub const D92: &str = "D92"; // Invalid recovery handling
pub const D93: &str = "D93"; // Account number restrictions based on operation codes
pub const D94: &str = "D94"; // Invalid security handling
pub const D95: &str = "D95"; // Invalid encryption handling
pub const D96: &str = "D96"; // Invalid authentication handling
pub const D97: &str = "D97"; // Invalid authorization handling
pub const D98: &str = "D98"; // Invalid validation handling
pub const D99: &str = "D99"; // Invalid verification handling
}
/// E-Series: Enhanced/Field Relation Validation Error Codes
///
/// These errors relate to advanced validation for instruction codes, field options,
/// and complex business rules.
pub mod e_series {
pub const E01: &str = "E01"; // Instruction code restrictions (SPRI field 23E can only contain SDVA, TELB, PHOB, INTC)
pub const E02: &str = "E02"; // Prohibited instruction codes (SSTD/SPAY field 23E not allowed)
pub const E03: &str = "E03"; // Field option restrictions (53a cannot use option D with SPRI/SSTD/SPAY)
pub const E04: &str = "E04"; // Party identifier requirements in specific contexts
pub const E05: &str = "E05"; // Field option restrictions for 54a
pub const E06: &str = "E06"; // Multiple field dependency (if 55a present, both 53a and 54a required)
pub const E07: &str = "E07"; // Field option restrictions for 55a
pub const E08: &str = "E08"; // Invalid instruction combination
pub const E09: &str = "E09"; // Party identifier mandatory in option D for field 57a
pub const E10: &str = "E10"; // Beneficiary account mandatory for specific operation codes
pub const E11: &str = "E11"; // Invalid option combination
pub const E12: &str = "E12"; // Invalid field combination
pub const E13: &str = "E13"; // OUR charge handling restrictions (field 71F not allowed, 71G optional)
pub const E14: &str = "E14"; // Invalid charge combination
pub const E15: &str = "E15"; // BEN charge handling requirements (field 71F mandatory, 71G not allowed)
pub const E16: &str = "E16"; // Field restrictions with SPRI (56a not allowed with SPRI)
pub const E17: &str = "E17"; // Clearing code requirements for option C
pub const E18: &str = "E18"; // Account restrictions with CHQB operation code
pub const E19: &str = "E19"; // Invalid operation combination
pub const E20: &str = "E20"; // Invalid service combination
pub const E21: &str = "E21"; // Invalid product combination
pub const E22: &str = "E22"; // Invalid feature combination
pub const E23: &str = "E23"; // Invalid function combination
pub const E24: &str = "E24"; // Invalid capability combination
pub const E25: &str = "E25"; // Invalid method combination
pub const E26: &str = "E26"; // Invalid procedure combination
pub const E27: &str = "E27"; // Invalid process combination
pub const E28: &str = "E28"; // Invalid workflow combination
pub const E29: &str = "E29"; // Invalid sequence combination
pub const E30: &str = "E30"; // Invalid step combination
pub const E31: &str = "E31"; // Invalid phase combination
pub const E32: &str = "E32"; // Invalid stage combination
pub const E33: &str = "E33"; // Invalid state combination
pub const E34: &str = "E34"; // Invalid status combination
pub const E35: &str = "E35"; // Invalid condition combination
pub const E36: &str = "E36"; // Invalid criteria combination
pub const E37: &str = "E37"; // Invalid requirement combination
pub const E38: &str = "E38"; // Invalid constraint combination
pub const E39: &str = "E39"; // Invalid restriction combination
pub const E40: &str = "E40"; // Invalid limitation combination
pub const E41: &str = "E41"; // Invalid boundary combination
pub const E42: &str = "E42"; // Invalid threshold combination
pub const E43: &str = "E43"; // Invalid limit combination
pub const E44: &str = "E44"; // Instruction code dependencies on field presence
pub const E45: &str = "E45"; // Instruction code field dependencies on field presence
pub const E46: &str = "E46"; // Invalid dependency combination
pub const E47: &str = "E47"; // Invalid relationship combination
pub const E48: &str = "E48"; // Invalid association combination
pub const E49: &str = "E49"; // Invalid connection combination
pub const E50: &str = "E50"; // Invalid link combination
pub const E51: &str = "E51"; // Invalid reference combination
pub const E52: &str = "E52"; // Invalid pointer combination
pub const E53: &str = "E53"; // Invalid identifier combination
pub const E54: &str = "E54"; // Invalid key combination
pub const E55: &str = "E55"; // Invalid index combination
pub const E56: &str = "E56"; // Invalid code combination
pub const E57: &str = "E57"; // Invalid value combination
pub const E58: &str = "E58"; // Invalid data combination
pub const E59: &str = "E59"; // Invalid content combination
pub const E60: &str = "E60"; // Invalid information combination
pub const E61: &str = "E61"; // Invalid detail combination
pub const E62: &str = "E62"; // Invalid element combination
pub const E63: &str = "E63"; // Invalid component combination
pub const E64: &str = "E64"; // Invalid part combination
pub const E65: &str = "E65"; // Invalid section combination
pub const E66: &str = "E66"; // Invalid segment combination
pub const E67: &str = "E67"; // Invalid block combination
pub const E68: &str = "E68"; // Invalid group combination
pub const E69: &str = "E69"; // Invalid set combination
pub const E70: &str = "E70"; // Invalid collection combination
pub const E71: &str = "E71"; // Invalid array combination
pub const E72: &str = "E72"; // Invalid list combination
pub const E73: &str = "E73"; // Invalid sequence combination
pub const E74: &str = "E74"; // Invalid order combination
pub const E75: &str = "E75"; // Invalid arrangement combination
pub const E76: &str = "E76"; // Invalid structure combination
pub const E77: &str = "E77"; // Invalid format combination
pub const E78: &str = "E78"; // Invalid pattern combination
pub const E79: &str = "E79"; // Invalid template combination
pub const E80: &str = "E80"; // Invalid schema combination
pub const E81: &str = "E81"; // Invalid model combination
pub const E82: &str = "E82"; // Invalid design combination
pub const E83: &str = "E83"; // Invalid specification combination
pub const E84: &str = "E84"; // Invalid definition combination
pub const E85: &str = "E85"; // Invalid description combination
pub const E86: &str = "E86"; // Invalid configuration combination
}
/// G-Series: General/Field Validation Error Codes
///
/// The largest category covering general field validation across all MT categories,
/// particularly prominent in Categories 2, 3, 5-9.
pub mod g_series {
// Sample G-series codes - in practice, this would contain all 823 codes
pub const G001: &str = "G001"; // Field format violation
pub const G002: &str = "G002"; // Field length violation
pub const G003: &str = "G003"; // Field content violation
pub const G004: &str = "G004"; // Field pattern violation
pub const G005: &str = "G005"; // Field range violation
pub const G006: &str = "G006"; // Field type violation
pub const G007: &str = "G007"; // Field structure violation
pub const G008: &str = "G008"; // Field sequence violation
pub const G009: &str = "G009"; // Field order violation
pub const G010: &str = "G010"; // Field position violation
pub const G011: &str = "G011"; // Field occurrence violation
pub const G012: &str = "G012"; // Field repetition violation
pub const G013: &str = "G013"; // Field multiplicity violation
pub const G014: &str = "G014"; // Field cardinality violation
pub const G015: &str = "G015"; // Field optionality violation
pub const G016: &str = "G016"; // Field mandatory violation
pub const G017: &str = "G017"; // Field conditional violation
pub const G018: &str = "G018"; // Field dependency violation
pub const G019: &str = "G019"; // Field exclusion violation
pub const G020: &str = "G020"; // Field inclusion violation
pub const G021: &str = "G021"; // Field choice violation
pub const G022: &str = "G022"; // Field alternative violation
pub const G023: &str = "G023"; // Field option violation
pub const G024: &str = "G024"; // Field variant violation
pub const G025: &str = "G025"; // Field version violation
pub const G026: &str = "G026"; // Field release violation
pub const G027: &str = "G027"; // Field edition violation
pub const G028: &str = "G028"; // Field revision violation
pub const G029: &str = "G029"; // Field update violation
pub const G030: &str = "G030"; // Field modification violation
pub const G031: &str = "G031"; // Field change violation
pub const G032: &str = "G032"; // Field amendment violation
pub const G033: &str = "G033"; // Field correction violation
pub const G034: &str = "G034"; // Field adjustment violation
pub const G035: &str = "G035"; // Field enhancement violation
pub const G036: &str = "G036"; // Field improvement violation
pub const G037: &str = "G037"; // Field extension violation
pub const G038: &str = "G038"; // Field expansion violation
pub const G039: &str = "G039"; // Field addition violation
pub const G040: &str = "G040"; // Field supplementation violation
pub const G041: &str = "G041"; // Field completion violation
pub const G042: &str = "G042"; // Field finalization violation
pub const G043: &str = "G043"; // Field consolidation violation
pub const G044: &str = "G044"; // Field integration violation
pub const G045: &str = "G045"; // Field unification violation
pub const G046: &str = "G046"; // Field standardization violation
pub const G047: &str = "G047"; // Field normalization violation
pub const G048: &str = "G048"; // Field harmonization violation
pub const G049: &str = "G049"; // Field synchronization violation
pub const G050: &str = "G050"; // Field content validation
pub const G100: &str = "G100"; // Sequence validation
pub const G150: &str = "G150"; // Message validation
pub const G200: &str = "G200"; // Block validation
pub const G250: &str = "G250"; // Header validation
pub const G300: &str = "G300"; // Trailer validation
pub const G350: &str = "G350"; // Network validation
pub const G400: &str = "G400"; // System validation
pub const G450: &str = "G450"; // Service validation
pub const G500: &str = "G500"; // Product validation
pub const G550: &str = "G550"; // Feature validation
pub const G600: &str = "G600"; // Function validation
pub const G650: &str = "G650"; // Capability validation
pub const G700: &str = "G700"; // Method validation
pub const G750: &str = "G750"; // Procedure validation
pub const G800: &str = "G800"; // Process validation
// Note: In practice, this module would contain all 823 G-series codes
// This is a representative sample showing the naming convention
}
/// Error code lookup and metadata
pub mod metadata {
use once_cell::sync::Lazy;
use std::collections::HashMap;
/// Error code metadata structure
#[derive(Debug, Clone)]
pub struct ErrorCodeInfo {
pub code: &'static str,
pub series: &'static str,
pub category: &'static str,
pub description: &'static str,
pub when_thrown: &'static str,
pub mt_categories: &'static [&'static str],
}
/// Static lookup table for error code metadata
pub static ERROR_CODE_METADATA: Lazy<HashMap<&'static str, ErrorCodeInfo>> = Lazy::new(|| {
let mut map = HashMap::new();
// T-Series metadata
map.insert(
"T08",
ErrorCodeInfo {
code: "T08",
series: "T",
category: "Format Validation",
description: "Invalid code in field",
when_thrown: "Field contains invalid enumerated value",
mt_categories: &["1", "2", "3", "4", "5", "6", "7", "8", "9"],
},
);
map.insert(
"T27",
ErrorCodeInfo {
code: "T27",
series: "T",
category: "Format Validation",
description: "Invalid BIC code format",
when_thrown: "BIC doesn't match required pattern",
mt_categories: &["1", "2", "3", "5"],
},
);
map.insert(
"T50",
ErrorCodeInfo {
code: "T50",
series: "T",
category: "Format Validation",
description: "Invalid date format",
when_thrown: "Date not in YYMMDD format",
mt_categories: &["1", "2", "3", "4", "5", "6", "7", "8", "9"],
},
);
// C-Series metadata
map.insert(
"C02",
ErrorCodeInfo {
code: "C02",
series: "C",
category: "Business Rules",
description: "Currency code mismatch",
when_thrown: "Related fields have different currencies",
mt_categories: &["1", "2", "3", "5"],
},
);
// D-Series metadata
map.insert(
"D19",
ErrorCodeInfo {
code: "D19",
series: "D",
category: "Content Validation",
description: "IBAN mandatory for SEPA",
when_thrown: "EU payment without IBAN in beneficiary field",
mt_categories: &["1"],
},
);
// E-Series metadata
map.insert(
"E01",
ErrorCodeInfo {
code: "E01",
series: "E",
category: "Relation Validation",
description: "Instruction code restrictions",
when_thrown: "Field 23E with SPRI can only contain SDVA, TELB, PHOB, INTC",
mt_categories: &["1"],
},
);
// G-Series metadata
map.insert(
"G001",
ErrorCodeInfo {
code: "G001",
series: "G",
category: "General Validation",
description: "Field format violation",
when_thrown: "Field doesn't match specified format pattern",
mt_categories: &["2", "3", "5", "6", "7", "8", "9"],
},
);
map
});
/// Get metadata for an error code
pub fn get_error_info(code: &str) -> Option<&'static ErrorCodeInfo> {
ERROR_CODE_METADATA.get(code)
}
/// Get all error codes for a specific series
pub fn get_codes_by_series(series: &str) -> Vec<&'static str> {
ERROR_CODE_METADATA
.values()
.filter(|info| info.series == series)
.map(|info| info.code)
.collect()
}
/// Get all error codes for a specific MT category
pub fn get_codes_by_category(category: &str) -> Vec<&'static str> {
ERROR_CODE_METADATA
.values()
.filter(|info| info.mt_categories.contains(&category))
.map(|info| info.code)
.collect()
}
}
/// Regional validation constants
pub mod regional {
/// SEPA country codes requiring IBAN validation
pub const SEPA_COUNTRIES: &[&str] = &[
"AD", "AT", "BE", "BG", "BV", "CH", "CY", "CZ", "DE", "DK", "EE", "ES", "FI", "FR", "GB",
"GF", "GI", "GP", "GR", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MQ", "MT",
"NL", "NO", "PL", "PM", "PT", "RE", "RO", "SE", "SI", "SJ", "SK", "SM", "TF", "VA",
];
/// Check if a country code is in the SEPA region
pub fn is_sepa_country(country_code: &str) -> bool {
SEPA_COUNTRIES.contains(&country_code)
}
}
/// Charge code validation constants
pub mod charges {
/// Valid charge codes
pub const CHARGE_CODES: &[&str] = &["BEN", "OUR", "SHA"];
/// Check if a charge code is valid
pub fn is_valid_charge_code(code: &str) -> bool {
CHARGE_CODES.contains(&code)
}
}
/// Currency validation constants
pub mod currencies {
/// Commodity currencies not allowed in payment messages
pub const COMMODITY_CURRENCIES: &[&str] = &["XAU", "XAG", "XPD", "XPT"];
/// Check if a currency is a commodity currency
pub fn is_commodity_currency(currency: &str) -> bool {
COMMODITY_CURRENCIES.contains(¤cy)
}
}