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}