swift_mt_message/messages/
mt292.rs1use crate::errors::{ParseError, SwiftValidationError};
2use crate::fields::*;
3use crate::parser::MessageParser;
4use crate::parser::utils::*;
5use serde::{Deserialize, Serialize};
6use std::collections::HashMap;
7
8#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
15pub struct MT292 {
16 #[serde(rename = "20")]
18 pub field_20: Field20,
19
20 #[serde(rename = "21")]
22 pub field_21: Field21NoOption,
23
24 #[serde(rename = "11S")]
26 pub field_11s: Field11S,
27
28 #[serde(rename = "79", skip_serializing_if = "Option::is_none")]
30 pub field_79: Option<Field79>,
31
32 #[serde(flatten, skip_serializing_if = "HashMap::is_empty")]
34 pub original_fields: HashMap<String, serde_json::Value>,
35}
36
37impl MT292 {
38 pub fn parse_from_block4(block4: &str) -> Result<Self, ParseError> {
40 let mut parser = MessageParser::new(block4, "292");
41
42 let field_20 = parser.parse_field::<Field20>("20")?;
44 let field_21 = parser.parse_field::<Field21NoOption>("21")?;
45 let field_11s = parser.parse_field::<Field11S>("11S")?;
46
47 let field_79 = parser.parse_optional_field::<Field79>("79")?;
49
50 let original_fields = HashMap::new();
53
54 if field_79.is_none() && original_fields.is_empty() {
56 return Err(ParseError::InvalidFormat {
57 message:
58 "MT292: Either Field 79 or copy of original message fields must be present"
59 .to_string(),
60 });
61 }
62
63 Ok(MT292 {
64 field_20,
65 field_21,
66 field_11s,
67 field_79,
68 original_fields,
69 })
70 }
71
72 fn has_field_79(&self) -> bool {
82 self.field_79.is_some()
83 }
84
85 fn has_original_fields(&self) -> bool {
87 !self.original_fields.is_empty()
88 }
89
90 fn validate_c1_field_79_or_original_fields(&self) -> Option<SwiftValidationError> {
98 let has_79 = self.has_field_79();
99 let has_original = self.has_original_fields();
100
101 if !has_79 && !has_original {
102 return Some(SwiftValidationError::content_error(
103 "C25",
104 "79",
105 "",
106 "Field 79 (Narrative Description) or a copy of at least the mandatory fields of the original message must be present",
107 "Either field 79 or a copy of at least the mandatory fields of the original message or both must be present",
108 ));
109 }
110
111 None
112 }
113
114 pub fn validate_network_rules(&self, stop_on_first_error: bool) -> Vec<SwiftValidationError> {
117 let mut all_errors = Vec::new();
118
119 if let Some(error) = self.validate_c1_field_79_or_original_fields() {
121 all_errors.push(error);
122 if stop_on_first_error {
123 return all_errors;
124 }
125 }
126
127 all_errors
128 }
129}
130
131impl crate::traits::SwiftMessageBody for MT292 {
132 fn message_type() -> &'static str {
133 "292"
134 }
135
136 fn parse_from_block4(block4: &str) -> Result<Self, crate::errors::ParseError> {
137 Self::parse_from_block4(block4)
138 }
139
140 fn to_mt_string(&self) -> String {
141 let mut result = String::new();
142
143 append_field(&mut result, &self.field_20);
145 append_field(&mut result, &self.field_21);
146 append_field(&mut result, &self.field_11s);
147
148 append_optional_field(&mut result, &self.field_79);
150
151 finalize_mt_string(result, false)
152 }
153
154 fn validate_network_rules(&self, stop_on_first_error: bool) -> Vec<SwiftValidationError> {
155 MT292::validate_network_rules(self, stop_on_first_error)
157 }
158}