swift_mt_message/fields/
field12.rs

1//! **Field 12: Sub Message Type**
2//!
3//! Provides additional categorization within main MT message types for routing and processing.
4
5use super::swift_utils::{parse_exact_length, parse_numeric};
6use crate::traits::SwiftField;
7use serde::{Deserialize, Serialize};
8
9/// **Field 12: Sub Message Type**
10///
11/// Specifies sub-message type code for additional categorization within main MT message types.
12///
13/// **Format:** `3!n` (exactly 3 numeric digits)
14///
15/// **Example:**
16/// ```text
17/// :12:103
18/// ```
19#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
20pub struct Field12 {
21    /// Sub-message type code (3 digits, numeric only)
22    pub type_code: String,
23}
24
25impl SwiftField for Field12 {
26    fn parse(input: &str) -> crate::Result<Self>
27    where
28        Self: Sized,
29    {
30        // Must be exactly 3 numeric digits
31        let type_code = parse_exact_length(input, 3, "Field 12 type code")?;
32        parse_numeric(&type_code, "Field 12 type code")?;
33
34        Ok(Field12 { type_code })
35    }
36
37    fn to_swift_string(&self) -> String {
38        format!(":12:{}", self.type_code)
39    }
40}
41
42#[cfg(test)]
43mod tests {
44    use super::*;
45
46    #[test]
47    fn test_field12_valid() {
48        let field = Field12::parse("103").unwrap();
49        assert_eq!(field.type_code, "103");
50        assert_eq!(field.to_swift_string(), ":12:103");
51
52        let field = Field12::parse("001").unwrap();
53        assert_eq!(field.type_code, "001");
54        assert_eq!(field.to_swift_string(), ":12:001");
55
56        let field = Field12::parse("950").unwrap();
57        assert_eq!(field.type_code, "950");
58        assert_eq!(field.to_swift_string(), ":12:950");
59    }
60
61    #[test]
62    fn test_field12_invalid() {
63        // Too short
64        assert!(Field12::parse("12").is_err());
65
66        // Too long
67        assert!(Field12::parse("1234").is_err());
68
69        // Non-numeric
70        assert!(Field12::parse("ABC").is_err());
71        assert!(Field12::parse("12A").is_err());
72    }
73}