ГОСТ-56042
Библиотека для работы с "ГОСТ Р 56042-2014 Стандарты финансовых операций. Двумерные символы штрихового кода для осуществления платежей физических лиц".
Обзор
Официальный документ на русском языке можно скачать с сайта or или напрямую.
Кодирование
Для кодирование можно использовать методы:
to_bytes(&self) -> super::Result<Vec<u8>>- преобразование структуры в массив байтов.write_to(&self, buffer: &mut Vec<u8>) -> super::Result<()>- заполнение буфера информацией о платеже.to_utf8_lossy(&self) -> super::Result<String>- преобразование структуры в строку. Из-за кодировок могут быть проблемы.
let raw = "ST00012|Name=ООО «Три кита»|PersonalAcc=40702810138250123017|BankName=ОАО \"БАНК\"|BIC=044525225|CorrespAcc=30101810400000000225|PayeeINN=6200098765|LastName=Иванов|FirstName=Иван|MiddleName=Иванович|Purpose=Оплата членского взноса|PayerAddress=г.Рязань ул.Ленина д.10 кв.15|Sum=100000";
let payment = builder
.with_additional_requisites
.build;
let payment = payment.to_utf8_lossy;
let payment = payment.as_ref.map;
assert_eq!;
Парсинг
Для парсинга необходимо создать структуру PaymentParser с помощью Payment::parser().
PaymentParser имеет следующие методы:
parse_from_str(&self, val: &str) -> super::Result<Payment<T>>- создание структуры из строки. Предполагается, что данные находятся в формате Utf-8.parse_from_bytes(&self, bytes: &[u8]) -> super::Result<Payment<T>>- создание структуры из массива байтов.
Пример from_str:
let raw = "ST00012|Name=ООО «Три кита»|PersonalAcc=40702810138250123017|BankName=ОАО \"БАНК\"|BIC=044525225|CorrespAcc=30101810400000000225";
let parsed_payment = parser.parse_from_str;
let payment = custom_builder
.build;
assert_eq!;
Пример from_bytes:
let raw = "ST00012|Name=ООО «Три кита»|PersonalAcc=40702810138250123017|BankName=ОАО \"БАНК\"|BIC=044525225|CorrespAcc=30101810400000000225".as_bytes;
let parsed_payment = parser.parse_from_bytes;
let payment = custom_builder
.build;
assert_eq!;
Получение реквизитов
let payment = builder
.build;
assert_eq!;
Определение новых реквизитов
Для добавления новых реквизитов необходимо создать собственный тип и реализовать для него трейт CustomRequisites.
let raw = "ST00012|Name=ООО «Три кита»|PersonalAcc=40702810138250123017|BankName=ОАО \"БАНК\"|BIC=044525225|CorrespAcc=30101810400000000225|Foo=Foo|Bar=Bar";
let payment = custom_builder
.with_additional_requisites
.build;
assert_eq!;
assert_eq!;
let payment = payment.to_utf8_lossy;
let payment = payment.as_ref.map;
assert_eq!;
Тип парсеров
Реализованы следующие типы парсеров:
StrictParser- строгий парсер, делает все проверки.RequisiteToleranceParser- менее строгий парсер, если произошла ошибка в парсинге реквизитов, то она игнорируется.LooseParser- нестрогий парсер, проверяет только заголовок.
Для создания парсеров используются методы структуры Payment:
parser() -> PaymentParserpub fn requisite_tolerance_parser() -> PaymentParser<RequisiteToleranceParser>pub fn loose_parser() -> PaymentParser<LooseParser>
Для каждого метода существует метод custom_*, чтобы указать пользовательские реквизиты.
StrictParser:
let raw =
"ST00012|BankName=ОАО \"БАНК\"|BIC=044525225|CorrespAcc=30101810400000000225|Тест=42";
let parsed_payment = parser.parse_from_str;
assert!;
RequisiteToleranceParser:
let raw = "ST00012|Name=ООО «Три кита»|PersonalAcc=40702810138250123017|BankName=ОАО \"БАНК\"|BIC=044525225|CorrespAcc=30101810400000000225|Тест=42|fasfdsfsdfs| |";
let parsed_payment = requisite_tolerance_parser.parse_from_str;
let payment = builder
.build;
assert_eq!;
LooseParser:
let raw = "ST00012|Name=ООО «Три кита»||Тест=42|fasfdsfsdfs| |";
let parsed_payment = loose_parser.parse_from_str;
assert_eq!;