swift_mt_message/fields/
field13c.rs

1use serde::{Deserialize, Serialize};
2use swift_mt_message_macros::SwiftField;
3
4/// Field 13C: Time Indication
5///
6/// Time indication with code, time, and UTC offset.
7#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, SwiftField)]
8pub struct Field13C {
9    /// Time indication code with slashes
10    #[component("/8c/", validate = ["time_indication_code"])]
11    pub time_code: String,
12    /// Time (HHMM)
13    #[component("4!n", validate = ["time_format"])]
14    pub time: String,
15    /// UTC offset with sign
16    #[component("1!x4!n", validate = ["utc_offset_format"])]
17    pub utc_offset: String,
18}
19
20#[cfg(test)]
21mod tests {
22    use super::*;
23    use crate::SwiftField;
24
25    #[test]
26    fn test_field13c_parsing() {
27        let test_input = ":13C:/RNCTIME/1405+0200";
28        println!("Testing input: {test_input}");
29
30        match Field13C::parse(test_input) {
31            Ok(parsed) => {
32                println!("Successfully parsed:");
33                println!("  time_code: {}", parsed.time_code);
34                println!("  time: {}", parsed.time);
35                println!("  utc_offset: {}", parsed.utc_offset);
36
37                // Test serialization back
38                let serialized = parsed.to_swift_string();
39                println!("Serialized back: {serialized}");
40
41                // Verify the parsed values
42                assert_eq!(parsed.time_code, "/RNCTIME/");
43                assert_eq!(parsed.time, "1405");
44                assert_eq!(parsed.utc_offset, "+0200");
45            }
46            Err(e) => {
47                println!("Parsing failed: {e:?}");
48                panic!("Failed to parse Field13C: {e:?}");
49            }
50        }
51    }
52
53    #[test]
54    fn test_field13c_additional_cases() {
55        // Test different time codes and offsets
56        let test_cases = vec![
57            (":13C:/CLSTIME/2359-0500", "/CLSTIME/", "2359", "-0500"),
58            (":13C:/SNDTIME/0000+0000", "/SNDTIME/", "0000", "+0000"),
59            (":13C:/ABC/1200+0100", "/ABC/", "1200", "+0100"),
60        ];
61
62        for (input, expected_code, expected_time, expected_offset) in test_cases {
63            match Field13C::parse(input) {
64                Ok(parsed) => {
65                    assert_eq!(parsed.time_code, expected_code);
66                    assert_eq!(parsed.time, expected_time);
67                    assert_eq!(parsed.utc_offset, expected_offset);
68
69                    // Test round-trip
70                    let serialized = parsed.to_swift_string();
71                    assert_eq!(serialized, input);
72                }
73                Err(e) => {
74                    panic!("Failed to parse {input}: {e:?}");
75                }
76            }
77        }
78    }
79}