swift_mt_message/messages/
mt296.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 MT296 {
16 #[serde(rename = "20")]
18 pub field_20: Field20,
19
20 #[serde(rename = "21")]
22 pub field_21: Field21NoOption,
23
24 #[serde(rename = "76")]
26 pub field_76: Field76,
27
28 #[serde(rename = "77A", skip_serializing_if = "Option::is_none")]
30 pub field_77a: Option<Field77A>,
31
32 #[serde(rename = "11R", skip_serializing_if = "Option::is_none")]
34 pub field_11r: Option<Field11R>,
35
36 #[serde(rename = "11S", skip_serializing_if = "Option::is_none")]
38 pub field_11s: Option<Field11S>,
39
40 #[serde(rename = "79", skip_serializing_if = "Option::is_none")]
42 pub field_79: Option<Field79>,
43
44 #[serde(flatten, skip_serializing_if = "HashMap::is_empty")]
46 pub original_fields: HashMap<String, serde_json::Value>,
47}
48
49impl MT296 {
50 pub fn parse_from_block4(block4: &str) -> Result<Self, ParseError> {
52 let mut parser = MessageParser::new(block4, "296");
53
54 let field_20 = parser.parse_field::<Field20>("20")?;
56 let field_21 = parser.parse_field::<Field21NoOption>("21")?;
57 let field_76 = parser.parse_field::<Field76>("76")?;
58
59 let field_77a = parser.parse_optional_field::<Field77A>("77A")?;
61
62 let field_11r = parser.parse_optional_field::<Field11R>("11R")?;
64 let field_11s = parser.parse_optional_field::<Field11S>("11S")?;
65
66 let field_79 = parser.parse_optional_field::<Field79>("79")?;
68
69 let original_fields = HashMap::new();
72
73 if field_79.is_some() && !original_fields.is_empty() {
75 return Err(ParseError::InvalidFormat {
76 message: "MT296: Only one of Field 79 or copy of original message fields should be present (C1)".to_string(),
77 });
78 }
79
80 Ok(MT296 {
81 field_20,
82 field_21,
83 field_76,
84 field_77a,
85 field_11r,
86 field_11s,
87 field_79,
88 original_fields,
89 })
90 }
91
92 fn has_field_79(&self) -> bool {
102 self.field_79.is_some()
103 }
104
105 fn has_original_fields(&self) -> bool {
107 !self.original_fields.is_empty()
108 }
109
110 fn validate_c1_field_79_or_copy(&self) -> Option<SwiftValidationError> {
117 let has_79 = self.has_field_79();
118 let has_copy = self.has_original_fields();
119
120 if has_79 && has_copy {
121 return Some(SwiftValidationError::content_error(
123 "C31",
124 "79",
125 "",
126 "Field 79 and copy of original message fields must not both be present",
127 "Either field 79 or a copy of at least the mandatory fields of the message to which the answer relates, but not both, may be present in the message",
128 ));
129 }
130
131 None
132 }
133
134 pub fn validate_network_rules(&self, stop_on_first_error: bool) -> Vec<SwiftValidationError> {
137 let mut all_errors = Vec::new();
138
139 if let Some(error) = self.validate_c1_field_79_or_copy() {
141 all_errors.push(error);
142 if stop_on_first_error {
143 return all_errors;
144 }
145 }
146
147 all_errors
148 }
149}
150
151impl crate::traits::SwiftMessageBody for MT296 {
152 fn message_type() -> &'static str {
153 "296"
154 }
155
156 fn parse_from_block4(block4: &str) -> Result<Self, crate::errors::ParseError> {
157 Self::parse_from_block4(block4)
158 }
159
160 fn to_mt_string(&self) -> String {
161 let mut result = String::new();
162
163 append_field(&mut result, &self.field_20);
164 append_field(&mut result, &self.field_21);
165 append_field(&mut result, &self.field_76);
166 append_optional_field(&mut result, &self.field_77a);
167 append_optional_field(&mut result, &self.field_11r);
168 append_optional_field(&mut result, &self.field_11s);
169 append_optional_field(&mut result, &self.field_79);
170
171 finalize_mt_string(result, false)
175 }
176
177 fn validate_network_rules(&self, stop_on_first_error: bool) -> Vec<SwiftValidationError> {
178 MT296::validate_network_rules(self, stop_on_first_error)
180 }
181}