iso_20022_setr/
setr_008_001_04.rs

1// Copyright 2023 Emergent Financial, LLC - All Rights Reserved
2//
3//
4// This software is licensed under the Emergent Financial Limited Public License Version 1.0
5// (EF-LPLv1). You may use, copy, modify, and distribute this software under the terms and
6// conditions of the EF-LPL. For more information, please refer to the full text of the license
7// at https://github.com/emergentfinancial/ef-lpl.
8//
9//
10// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS
11// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
12// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
13// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
14// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
15// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
16//
17// See ISO-20022 Intellectual Property Rights Policy at
18// <https://www.iso20022.org/intellectual-property-rights>
19// for more information.
20
21use 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
39/// Returns the namespace of the schema
40pub 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}