1use validator::Validate;
22
23::lazy_static::lazy_static! {
24 static ref COUNTRY_CODE_REGEX: ::regex::Regex = ::regex::Regex::new(r#"[A-Z]{2,2}"#).unwrap();
25}
26
27::lazy_static::lazy_static! {
28 static ref EXACT_4_ALPHA_NUMERIC_TEXT_REGEX: ::regex::Regex = ::regex::Regex::new(r#"[a-zA-Z0-9]{4}"#).unwrap();
29}
30
31::lazy_static::lazy_static! {
32 static ref ANY_BIC_IDENTIFIER_REGEX: ::regex::Regex = ::regex::Regex::new(r#"[A-Z]{6,6}[A-Z2-9][A-NP-Z0-9]([A-Z0-9]{3,3}){0,1}"#).unwrap();
33}
34
35::lazy_static::lazy_static! {
36 static ref LEI_IDENTIFIER_REGEX: ::regex::Regex = ::regex::Regex::new(r#"[A-Z0-9]{18,18}[0-9]{2,2}"#).unwrap();
37}
38
39pub fn namespace() -> String {
41 "urn:iso:std:iso:20022:tech:xsd:setr.008.001.04".to_string()
42}
43
44#[derive(
45 Debug,
46 Default,
47 Clone,
48 PartialEq,
49 ::serde::Serialize,
50 ::serde::Deserialize,
51 ::derive_builder::Builder,
52 ::validator::Validate,
53)]
54pub struct Max35Text {
55 #[validate(length(min = 1, max = 35,))]
56 #[serde(rename = "$text")]
57 pub value: String,
58}
59#[derive(
60 Debug,
61 Default,
62 Clone,
63 PartialEq,
64 ::serde::Serialize,
65 ::serde::Deserialize,
66 ::derive_builder::Builder,
67 ::validator::Validate,
68)]
69pub struct AdditionalReference9 {
70 #[validate]
71 #[serde(rename = "Ref")]
72 pub r#ref: Max35Text,
73 #[serde(rename = "RefIssr", skip_serializing_if = "Option::is_none")]
74 pub ref_issr: Option<PartyIdentification113>,
75 #[serde(rename = "MsgNm", skip_serializing_if = "Option::is_none")]
76 pub msg_nm: Option<Max35Text>,
77}
78#[derive(
79 Debug,
80 Default,
81 Clone,
82 PartialEq,
83 ::serde::Serialize,
84 ::serde::Deserialize,
85 ::derive_builder::Builder,
86 ::validator::Validate,
87)]
88pub struct PartyIdentification90ChoiceEnum {
89 #[serde(rename = "NmAndAdr", skip_serializing_if = "Option::is_none")]
90 pub nm_and_adr: Option<NameAndAddress5>,
91 #[serde(rename = "AnyBIC", skip_serializing_if = "Option::is_none")]
92 pub any_bic: Option<AnyBicIdentifier>,
93 #[serde(rename = "PrtryId", skip_serializing_if = "Option::is_none")]
94 pub prtry_id: Option<GenericIdentification1>,
95}
96#[derive(
97 Debug,
98 Default,
99 Clone,
100 PartialEq,
101 ::serde::Serialize,
102 ::serde::Deserialize,
103 ::derive_builder::Builder,
104 ::validator::Validate,
105)]
106pub struct PartyIdentification90Choice {
107 #[serde(flatten)]
108 pub value: PartyIdentification90ChoiceEnum,
109}
110#[derive(
111 Debug,
112 Default,
113 Clone,
114 PartialEq,
115 ::serde::Serialize,
116 ::serde::Deserialize,
117 ::derive_builder::Builder,
118 ::validator::Validate,
119)]
120pub struct CountryCode {
121 #[validate(regex = "COUNTRY_CODE_REGEX")]
122 #[serde(rename = "$text")]
123 pub value: String,
124}
125#[derive(
126 Debug,
127 Default,
128 Clone,
129 PartialEq,
130 ::serde::Serialize,
131 ::serde::Deserialize,
132 ::derive_builder::Builder,
133 ::validator::Validate,
134)]
135pub struct GenericIdentification30 {
136 #[validate]
137 #[serde(rename = "Id")]
138 pub id: Exact4AlphaNumericText,
139 #[validate]
140 #[serde(rename = "Issr")]
141 pub issr: Max35Text,
142 #[serde(rename = "SchmeNm", skip_serializing_if = "Option::is_none")]
143 pub schme_nm: Option<Max35Text>,
144}
145#[derive(
146 Debug,
147 Default,
148 Clone,
149 PartialEq,
150 ::serde::Serialize,
151 ::serde::Deserialize,
152 ::derive_builder::Builder,
153 ::validator::Validate,
154)]
155pub struct SubscriptionBulkOrderCancellationRequestV04 {
156 #[validate]
157 #[serde(rename = "MsgId")]
158 pub msg_id: MessageIdentification1,
159 #[serde(rename = "PoolRef", skip_serializing_if = "Option::is_none")]
160 pub pool_ref: Option<AdditionalReference9>,
161 #[serde(rename = "PrvsRef", skip_serializing_if = "Option::is_none")]
162 pub prvs_ref: Option<AdditionalReference8>,
163 #[serde(rename = "MstrRef", skip_serializing_if = "Option::is_none")]
164 pub mstr_ref: Option<Max35Text>,
165 #[validate(length(min = 1,))]
166 #[serde(rename = "OrdrRefs", default)]
167 pub ordr_refs: Vec<InvestmentFundOrder9>,
168 #[serde(rename = "CpyDtls", skip_serializing_if = "Option::is_none")]
169 pub cpy_dtls: Option<CopyInformation4>,
170}
171#[derive(
172 Debug,
173 Default,
174 Clone,
175 PartialEq,
176 ::serde::Serialize,
177 ::serde::Deserialize,
178 ::derive_builder::Builder,
179 ::validator::Validate,
180)]
181pub struct NameAndAddress5 {
182 #[validate]
183 #[serde(rename = "Nm")]
184 pub nm: Max350Text,
185 #[serde(rename = "Adr", skip_serializing_if = "Option::is_none")]
186 pub adr: Option<PostalAddress1>,
187}
188#[derive(
189 Debug,
190 Default,
191 Clone,
192 PartialEq,
193 ::serde::Serialize,
194 ::serde::Deserialize,
195 ::derive_builder::Builder,
196 ::validator::Validate,
197)]
198pub struct PostalAddress1 {
199 #[serde(rename = "AdrTp", skip_serializing_if = "Option::is_none")]
200 pub adr_tp: Option<AddressType2Code>,
201 #[validate(length(min = 0, max = 5,))]
202 #[serde(rename = "AdrLine", default)]
203 pub adr_line: Vec<Max70Text>,
204 #[serde(rename = "StrtNm", skip_serializing_if = "Option::is_none")]
205 pub strt_nm: Option<Max70Text>,
206 #[serde(rename = "BldgNb", skip_serializing_if = "Option::is_none")]
207 pub bldg_nb: Option<Max16Text>,
208 #[serde(rename = "PstCd", skip_serializing_if = "Option::is_none")]
209 pub pst_cd: Option<Max16Text>,
210 #[serde(rename = "TwnNm", skip_serializing_if = "Option::is_none")]
211 pub twn_nm: Option<Max35Text>,
212 #[serde(rename = "CtrySubDvsn", skip_serializing_if = "Option::is_none")]
213 pub ctry_sub_dvsn: Option<Max35Text>,
214 #[serde(rename = "Ctry")]
215 pub ctry: CountryCode,
216}
217#[derive(
218 Debug,
219 Default,
220 Clone,
221 PartialEq,
222 ::serde::Serialize,
223 ::serde::Deserialize,
224 ::derive_builder::Builder,
225 ::validator::Validate,
226)]
227pub struct InvestmentFundOrder9 {
228 #[validate]
229 #[serde(rename = "OrdrRef")]
230 pub ordr_ref: Max35Text,
231 #[serde(rename = "ClntRef", skip_serializing_if = "Option::is_none")]
232 pub clnt_ref: Option<Max35Text>,
233 #[serde(rename = "CxlRef", skip_serializing_if = "Option::is_none")]
234 pub cxl_ref: Option<Max35Text>,
235 #[serde(rename = "CxlRsn", skip_serializing_if = "Option::is_none")]
236 pub cxl_rsn: Option<CancellationReason32Choice>,
237}
238#[derive(
239 Debug,
240 Default,
241 Clone,
242 PartialEq,
243 ::serde::Serialize,
244 ::serde::Deserialize,
245 ::derive_builder::Builder,
246 ::validator::Validate,
247)]
248pub struct AdditionalReference8 {
249 #[validate]
250 #[serde(rename = "Ref")]
251 pub r#ref: Max35Text,
252 #[serde(rename = "RefIssr", skip_serializing_if = "Option::is_none")]
253 pub ref_issr: Option<PartyIdentification113>,
254 #[serde(rename = "MsgNm", skip_serializing_if = "Option::is_none")]
255 pub msg_nm: Option<Max35Text>,
256}
257#[derive(
258 Debug,
259 Default,
260 Clone,
261 PartialEq,
262 ::serde::Serialize,
263 ::serde::Deserialize,
264 ::derive_builder::Builder,
265 ::validator::Validate,
266)]
267pub struct CancellationReason32ChoiceEnum {
268 #[serde(rename = "Cd", skip_serializing_if = "Option::is_none")]
269 pub cd: Option<Max35Text>,
270 #[serde(rename = "Prtry", skip_serializing_if = "Option::is_none")]
271 pub prtry: Option<GenericIdentification30>,
272}
273#[derive(
274 Debug,
275 Default,
276 Clone,
277 PartialEq,
278 ::serde::Serialize,
279 ::serde::Deserialize,
280 ::derive_builder::Builder,
281 ::validator::Validate,
282)]
283pub struct CancellationReason32Choice {
284 #[serde(flatten)]
285 pub value: CancellationReason32ChoiceEnum,
286}
287#[derive(
288 Debug,
289 Default,
290 Clone,
291 PartialEq,
292 ::serde::Serialize,
293 ::serde::Deserialize,
294 ::derive_builder::Builder,
295 ::validator::Validate,
296)]
297pub struct Exact4AlphaNumericText {
298 #[validate(regex = "EXACT_4_ALPHA_NUMERIC_TEXT_REGEX")]
299 #[serde(rename = "$text")]
300 pub value: String,
301}
302#[derive(
303 Debug,
304 Default,
305 Clone,
306 PartialEq,
307 ::serde::Serialize,
308 ::serde::Deserialize,
309 ::derive_builder::Builder,
310 ::validator::Validate,
311)]
312pub struct PartyIdentification113 {
313 #[serde(rename = "Pty")]
314 pub pty: PartyIdentification90Choice,
315 #[serde(rename = "LEI", skip_serializing_if = "Option::is_none")]
316 pub lei: Option<LeiIdentifier>,
317}
318#[derive(
319 Debug,
320 Default,
321 Clone,
322 PartialEq,
323 ::serde::Serialize,
324 ::serde::Deserialize,
325 ::derive_builder::Builder,
326 ::validator::Validate,
327)]
328pub struct YesNoIndicator {
329 #[serde(rename = "$text")]
330 pub value: bool,
331}
332#[derive(
333 Debug,
334 Default,
335 Clone,
336 PartialEq,
337 ::serde::Serialize,
338 ::serde::Deserialize,
339 ::derive_builder::Builder,
340 ::validator::Validate,
341)]
342pub struct IsoDateTime {
343 #[serde(rename = "$text")]
344 pub value: ::chrono::DateTime<::chrono::Utc>,
345}
346#[derive(
347 Debug,
348 Default,
349 Clone,
350 PartialEq,
351 ::serde::Serialize,
352 ::serde::Deserialize,
353 ::derive_builder::Builder,
354 ::validator::Validate,
355)]
356#[serde(rename = "Document")]
357pub struct Document {
358 #[validate]
359 #[serde(rename = "SbcptBlkOrdrCxlReq")]
360 pub sbcpt_blk_ordr_cxl_req: SubscriptionBulkOrderCancellationRequestV04,
361 #[serde(rename = "@xmlns", default = "namespace")]
362 pub xmlns: String,
363}
364#[derive(
365 Debug,
366 Default,
367 Clone,
368 PartialEq,
369 ::serde::Serialize,
370 ::serde::Deserialize,
371 ::derive_builder::Builder,
372 ::validator::Validate,
373)]
374pub struct AnyBicIdentifier {
375 #[validate(regex = "ANY_BIC_IDENTIFIER_REGEX")]
376 #[serde(rename = "$text")]
377 pub value: String,
378}
379#[derive(
380 Debug,
381 Default,
382 Clone,
383 PartialEq,
384 ::serde::Serialize,
385 ::serde::Deserialize,
386 ::derive_builder::Builder,
387 ::validator::Validate,
388)]
389pub struct CopyInformation4 {
390 #[validate]
391 #[serde(rename = "CpyInd")]
392 pub cpy_ind: YesNoIndicator,
393 #[serde(rename = "OrgnlRcvr", skip_serializing_if = "Option::is_none")]
394 pub orgnl_rcvr: Option<AnyBicIdentifier>,
395}
396#[derive(
397 Debug,
398 Default,
399 Clone,
400 PartialEq,
401 ::serde::Serialize,
402 ::serde::Deserialize,
403 ::derive_builder::Builder,
404 ::validator::Validate,
405)]
406pub struct LeiIdentifier {
407 #[validate(regex = "LEI_IDENTIFIER_REGEX")]
408 #[serde(rename = "$text")]
409 pub value: String,
410}
411#[derive(
412 Debug,
413 Default,
414 Clone,
415 PartialEq,
416 ::serde::Serialize,
417 ::serde::Deserialize,
418 ::derive_builder::Builder,
419 ::validator::Validate,
420)]
421pub struct Max16Text {
422 #[validate(length(min = 1, max = 16,))]
423 #[serde(rename = "$text")]
424 pub value: String,
425}
426#[derive(
427 Debug,
428 Default,
429 Clone,
430 PartialEq,
431 ::serde::Serialize,
432 ::serde::Deserialize,
433 ::derive_builder::Builder,
434 ::validator::Validate,
435)]
436pub struct Max350Text {
437 #[validate(length(min = 1, max = 350,))]
438 #[serde(rename = "$text")]
439 pub value: String,
440}
441#[derive(
442 Debug,
443 Default,
444 Clone,
445 PartialEq,
446 ::serde::Serialize,
447 ::serde::Deserialize,
448 ::derive_builder::Builder,
449 ::validator::Validate,
450)]
451pub struct Max70Text {
452 #[validate(length(min = 1, max = 70,))]
453 #[serde(rename = "$text")]
454 pub value: String,
455}
456#[derive(Debug, Default, Clone, PartialEq, ::serde::Serialize, ::serde::Deserialize)]
457pub enum AddressType2Code {
458 #[serde(rename = "ADDR")]
459 Addr,
460 #[serde(rename = "PBOX")]
461 Pbox,
462 #[serde(rename = "HOME")]
463 Home,
464 #[serde(rename = "BIZZ")]
465 Bizz,
466 #[serde(rename = "MLTO")]
467 Mlto,
468 #[serde(rename = "DLVY")]
469 Dlvy,
470 #[default]
471 Unknown,
472}
473#[derive(
474 Debug,
475 Default,
476 Clone,
477 PartialEq,
478 ::serde::Serialize,
479 ::serde::Deserialize,
480 ::derive_builder::Builder,
481 ::validator::Validate,
482)]
483pub struct MessageIdentification1 {
484 #[validate]
485 #[serde(rename = "Id")]
486 pub id: Max35Text,
487 #[validate]
488 #[serde(rename = "CreDtTm")]
489 pub cre_dt_tm: IsoDateTime,
490}
491#[derive(
492 Debug,
493 Default,
494 Clone,
495 PartialEq,
496 ::serde::Serialize,
497 ::serde::Deserialize,
498 ::derive_builder::Builder,
499 ::validator::Validate,
500)]
501pub struct GenericIdentification1 {
502 #[validate]
503 #[serde(rename = "Id")]
504 pub id: Max35Text,
505 #[serde(rename = "SchmeNm", skip_serializing_if = "Option::is_none")]
506 pub schme_nm: Option<Max35Text>,
507 #[serde(rename = "Issr", skip_serializing_if = "Option::is_none")]
508 pub issr: Option<Max35Text>,
509}