swift_mt_message/
utils.rs

1//! Utility functions for SWIFT message processing
2
3use crate::parser::extract_base_tag;
4
5/// Helper function to get field tag with variant for enum fields
6pub fn get_field_tag_with_variant<T>(base_tag: &str, field_value: &T) -> String
7where
8    T: std::fmt::Debug,
9{
10    let debug_string = format!("{field_value:?}");
11
12    // Extract variant from debug string (e.g., "K(...)" -> "K")
13    if let Some(variant_end) = debug_string.find('(') {
14        let variant = &debug_string[..variant_end];
15
16        // Special handling for "NoOption" variant - use base tag without suffix
17        if variant == "NoOption" {
18            base_tag.to_string()
19        } else {
20            format!("{base_tag}{variant}")
21        }
22    } else {
23        base_tag.to_string()
24    }
25}
26
27/// Get field tag for MT serialization by stripping index suffix
28pub fn get_field_tag_for_mt(tag: &str) -> String {
29    extract_base_tag(tag).to_string()
30}
31
32#[cfg(test)]
33mod tests {
34    use super::*;
35
36    #[test]
37    fn test_get_field_tag_for_mt() {
38        // Test conversion for MT serialization
39        assert_eq!(get_field_tag_for_mt("50"), "50");
40        assert_eq!(get_field_tag_for_mt("50#1"), "50");
41        assert_eq!(get_field_tag_for_mt("50#2"), "50");
42        assert_eq!(get_field_tag_for_mt("32A#1"), "32A");
43        assert_eq!(get_field_tag_for_mt("34F#10"), "34F");
44
45        // Test tags without index
46        assert_eq!(get_field_tag_for_mt("20"), "20");
47        assert_eq!(get_field_tag_for_mt("32A"), "32A");
48        assert_eq!(get_field_tag_for_mt("59F"), "59F");
49    }
50}