gost_56042/
lib.rs

1#![no_std]
2
3extern crate alloc;
4
5mod custom;
6mod error;
7mod parser;
8mod payment;
9mod string_types;
10
11pub use custom::*;
12pub use error::{Error, Result};
13pub use parser::*;
14pub use payment::*;
15pub use string_types::*;
16
17#[cfg(test)]
18mod tests {
19    use crate::{
20        string_types::StringExt, CustomRequisites, Error, ParserStrategy, Payment,
21        RequiredRequisite, Requisite,
22    };
23
24    #[test]
25    fn encoding_test() {
26        let raw = "ST00012|Name=ООО «Три кита»|PersonalAcc=40702810138250123017|BankName=ОАО \"БАНК\"|BIC=044525225|CorrespAcc=30101810400000000225";
27
28        let payment = Payment::builder(RequiredRequisite {
29            name: "ООО «Три кита»".to_max_size().unwrap(),
30            personal_acc: "40702810138250123017".to_exact_size().unwrap(),
31            bank_name: "ОАО \"БАНК\"".to_max_size().unwrap(),
32            bic: "044525225".to_exact_size().unwrap(),
33            correstp_acc: "30101810400000000225".to_max_size().unwrap(),
34        })
35        .build();
36
37        let payment = payment.to_utf8_lossy();
38        let payment = payment.as_ref().map(|s| s.as_str());
39
40        assert_eq!(payment, Ok(raw))
41    }
42
43    #[test]
44    fn decoding_bytes_test() {
45        let raw = "ST00012|Name=ООО «Три кита»|PersonalAcc=40702810138250123017|BankName=ОАО \"БАНК\"|BIC=044525225|CorrespAcc=30101810400000000225".as_bytes();
46
47        let parsed_payment = Payment::parser().parse_from_bytes(raw);
48
49        let payment = Payment::custom_builder(RequiredRequisite {
50            name: "ООО «Три кита»".to_max_size().unwrap(),
51            personal_acc: "40702810138250123017".to_exact_size().unwrap(),
52            bank_name: "ОАО \"БАНК\"".to_max_size().unwrap(),
53            bic: "044525225".to_exact_size().unwrap(),
54            correstp_acc: "30101810400000000225".to_max_size().unwrap(),
55        })
56        .build();
57
58        assert_eq!(parsed_payment, Ok(payment));
59    }
60
61    #[test]
62    fn decoding_string_test() {
63        let raw = "ST00012|Name=ООО «Три кита»|PersonalAcc=40702810138250123017|BankName=ОАО \"БАНК\"|BIC=044525225|CorrespAcc=30101810400000000225";
64
65        let parsed_payment = Payment::parser().parse_from_str(raw);
66
67        let payment = Payment::custom_builder(RequiredRequisite {
68            name: "ООО «Три кита»".to_max_size().unwrap(),
69            personal_acc: "40702810138250123017".to_exact_size().unwrap(),
70            bank_name: "ОАО \"БАНК\"".to_max_size().unwrap(),
71            bic: "044525225".to_exact_size().unwrap(),
72            correstp_acc: "30101810400000000225".to_max_size().unwrap(),
73        })
74        .build();
75
76        assert_eq!(parsed_payment, Ok(payment));
77    }
78
79    #[test]
80    fn decoding_example_test() {
81        let raw = "ST00012|Name=ООО «Три кита»|PersonalAcc=40702810138250123017|BankName=ОАО \"БАНК\"|BIC=044525225|CorrespAcc=30101810400000000225|PayeeINN=6200098765|LastName=Иванов|FirstName=Иван|MiddleName=Иванович|Purpose=Оплата членского взноса|PayerAddress=г.Рязань ул.Ленина д.10 кв.15|Sum=100000";
82
83        let parsed_payment = Payment::parser().parse_from_str(raw);
84
85        let payment = Payment::custom_builder(RequiredRequisite {
86            name: "ООО «Три кита»".to_max_size().unwrap(),
87            personal_acc: "40702810138250123017".to_exact_size().unwrap(),
88            bank_name: "ОАО \"БАНК\"".to_max_size().unwrap(),
89            bic: "044525225".to_exact_size().unwrap(),
90            correstp_acc: "30101810400000000225".to_max_size().unwrap(),
91        })
92        .with_additional_requisites([
93            Requisite::PayeeINN("6200098765".to_max_size().unwrap()),
94            Requisite::LastName("Иванов".into()),
95            Requisite::FirstName("Иван".into()),
96            Requisite::MiddleName("Иванович".into()),
97            Requisite::Purpose("Оплата членского взноса".to_max_size().unwrap()),
98            Requisite::PayerAddress("г.Рязань ул.Ленина д.10 кв.15".into()),
99            Requisite::Sum("100000".to_max_size().unwrap()),
100        ])
101        .build();
102
103        assert_eq!(parsed_payment, Ok(payment));
104    }
105
106    #[test]
107    fn encoding_example_test() {
108        let raw = "ST00012|Name=ООО «Три кита»|PersonalAcc=40702810138250123017|BankName=ОАО \"БАНК\"|BIC=044525225|CorrespAcc=30101810400000000225|PayeeINN=6200098765|LastName=Иванов|FirstName=Иван|MiddleName=Иванович|Purpose=Оплата членского взноса|PayerAddress=г.Рязань ул.Ленина д.10 кв.15|Sum=100000";
109
110        let payment = Payment::builder(RequiredRequisite {
111            name: "ООО «Три кита»".to_max_size().unwrap(),
112            personal_acc: "40702810138250123017".to_exact_size().unwrap(),
113            bank_name: "ОАО \"БАНК\"".to_max_size().unwrap(),
114            bic: "044525225".to_exact_size().unwrap(),
115            correstp_acc: "30101810400000000225".to_max_size().unwrap(),
116        })
117        .with_additional_requisites([
118            Requisite::PayeeINN("6200098765".to_max_size().unwrap()),
119            Requisite::LastName("Иванов".into()),
120            Requisite::FirstName("Иван".into()),
121            Requisite::MiddleName("Иванович".into()),
122            Requisite::Purpose("Оплата членского взноса".to_max_size().unwrap()),
123            Requisite::PayerAddress("г.Рязань ул.Ленина д.10 кв.15".into()),
124            Requisite::Sum("100000".to_max_size().unwrap()),
125        ])
126        .build();
127
128        let payment = payment.to_utf8_lossy();
129        let payment = payment.as_ref().map(|s| s.as_str());
130
131        assert_eq!(payment, Ok(raw));
132    }
133
134    #[test]
135    fn custom_requisit_test() {
136        enum MyReq {
137            Foo,
138            Bar,
139        }
140
141        impl TryFrom<(&str, &str)> for MyReq {
142            type Error = Error;
143
144            fn try_from(_: (&str, &str)) -> Result<Self, Self::Error> {
145                Ok(Self::Foo)
146            }
147        }
148
149        impl CustomRequisites for MyReq {
150            fn key(&self) -> &str {
151                match self {
152                    MyReq::Foo => "Foo",
153                    MyReq::Bar => "Bar",
154                }
155            }
156
157            fn value(&self) -> &str {
158                match self {
159                    MyReq::Foo => "Foo",
160                    MyReq::Bar => "Bar",
161                }
162            }
163        }
164
165        let raw = "ST00012|Name=ООО «Три кита»|PersonalAcc=40702810138250123017|BankName=ОАО \"БАНК\"|BIC=044525225|CorrespAcc=30101810400000000225|Foo=Foo|Bar=Bar";
166
167        let payment = Payment::custom_builder(RequiredRequisite {
168            name: "ООО «Три кита»".to_max_size().unwrap(),
169            personal_acc: "40702810138250123017".to_exact_size().unwrap(),
170            bank_name: "ОАО \"БАНК\"".to_max_size().unwrap(),
171            bic: "044525225".to_exact_size().unwrap(),
172            correstp_acc: "30101810400000000225".to_max_size().unwrap(),
173        })
174        .with_additional_requisites([Requisite::Custom(MyReq::Foo), Requisite::Custom(MyReq::Bar)])
175        .build();
176
177        assert_eq!(payment.get("Foo"), Some("Foo"));
178        assert_eq!(payment.get("Bar"), Some("Bar"));
179
180        let payment = payment.to_utf8_lossy();
181        let payment = payment.as_ref().map(|s| s.as_str());
182
183        assert_eq!(payment, Ok(raw));
184    }
185
186    #[test]
187    fn wrong_order_test() {
188        let raw = "ST00012|PersonalAcc=40702810138250123017|Name=ООО «Три кита»|BankName=ОАО \"БАНК\"|BIC=044525225|CorrespAcc=30101810400000000225|PayeeINN=6200098765|LastName=Иванов|FirstName=Иван|MiddleName=Иванович|Purpose=Оплата членского взноса|PayerAddress=г.Рязань ул.Ленина д.10 кв.15|Sum=100000";
189        let parsed_payment = Payment::parser().parse_from_str(raw);
190
191        assert_eq!(
192            parsed_payment,
193            Err(Error::WrongRequiredRequisiteOrder {
194                passed: "PersonalAcc".into(),
195                expected: "Name".into()
196            })
197        );
198    }
199
200    #[test]
201    fn strict_parser_test() {
202        let raw =
203            "ST00012|BankName=ОАО \"БАНК\"|BIC=044525225|CorrespAcc=30101810400000000225|Тест=42";
204
205        let parsed_payment = Payment::parser().parse_from_str(raw);
206
207        assert!(parsed_payment.is_err());
208    }
209
210    #[test]
211    fn requisite_tolerance_parser_test() {
212        let raw = "ST00012|Name=ООО «Три кита»|PersonalAcc=40702810138250123017|BankName=ОАО \"БАНК\"|BIC=044525225|CorrespAcc=30101810400000000225|Тест=42|fasfdsfsdfs|  |";
213
214        let parsed_payment = Payment::requisite_tolerance_parser().parse_from_str(raw);
215
216        let payment = Payment::builder(RequiredRequisite {
217            name: "ООО «Три кита»".to_max_size().unwrap(),
218            personal_acc: "40702810138250123017".to_exact_size().unwrap(),
219            bank_name: "ОАО \"БАНК\"".to_max_size().unwrap(),
220            bic: "044525225".to_exact_size().unwrap(),
221            correstp_acc: "30101810400000000225".to_max_size().unwrap(),
222        })
223        .build();
224
225        assert_eq!(parsed_payment, Ok(payment));
226    }
227
228    #[test]
229    fn loose_parser_test() {
230        let raw = "ST00012|Name=ООО «Три кита»||Тест=42|fasfdsfsdfs|  |";
231
232        let parsed_payment = Payment::loose_parser().parse_from_str(raw);
233
234        assert_eq!(parsed_payment.unwrap().get("Name"), Some("ООО «Три кита»"));
235    }
236}