pix_brcode/
lib.rs

1//! Described on:
2//! Pix Manual:      https://www.bcb.gov.br/content/estabilidadefinanceira/pix/Regulamento_Pix/II_ManualdePadroesparaIniciacaodoPix_versao2-3-0.pdf
3//! BR Code Manual:  https://www.bcb.gov.br/content/estabilidadefinanceira/spb_docs/ManualBRCode.pdf
4//! Arranjos QRCode: https://www.bcb.gov.br/content/estabilidadefinanceira/forumpireunioes/Anexo%20I%20-%20Padr%C3%B5es%20para%20Inicia%C3%A7%C3%A3o%20do%20PIX.pdf
5//!
6//! Múltiplos arranjos podem existir em um mesmo QR Code
7
8use std::borrow::Cow;
9
10use emv_qrcps::EmvEncoder;
11
12mod json_payload;
13pub mod qr_dinamico;
14pub mod qr_estatico;
15
16#[derive(EmvEncoder, Clone, Debug)]
17pub struct AdditionalData<'a> {
18    #[encoder(id = "05")]
19    /// Default de "***"
20    /// Não deve ser preenchido no dinâmico, caso seja, deve ser ignorado.
21    txid: Cow<'a, str>,
22}
23
24#[derive(EmvEncoder, Clone, Debug)]
25pub struct MerchantAccountInformation<'a> {
26    #[encoder(id = "00")]
27    /// Versão do Payload QRCPS-MPM. Default em "01"
28    pub gui: Cow<'a, str>,
29
30    #[encoder(id = "21")]
31    /// Instituição do usuário recebedor
32    pub instituicao: Cow<'a, str>,
33
34    #[encoder(id = "22")]
35    /// Tipo de conta do usuário recebedor
36    pub tipo_conta: Cow<'a, str>,
37
38    #[encoder(id = "23")]
39    /// Tipo de conta do usuário recebedor
40    pub agencia: Cow<'a, str>,
41
42    #[encoder(id = "24")]
43    /// Numero da conta do usuário recebedor
44    pub conta: Cow<'a, str>,
45}
46
47#[derive(EmvEncoder, Clone, Debug)]
48struct PixSchema<'a> {
49    #[encoder(id = "00")]
50    /// Versão do Payload QRCPS-MPM. Default em "01"
51    pub format_indicator: Cow<'a, str>,
52
53    #[encoder(id = "01")]
54    /// Está presente para indicar que não deve ser iniciado mais de um pagamento com este mesmo QR Code.
55    pub point_of_initiation_method: Option<Cow<'a, str>>,
56
57    #[encoder(id = "26")]
58    pub merchant_account_information: MerchantAccountInformation<'a>,
59
60    #[encoder(id = "52")]
61    pub merchant_category_code: Cow<'a, str>,
62    #[encoder(id = "53")]
63    pub transaction_currency: Cow<'a, str>,
64    #[encoder(id = "54")]
65    pub transaction_amount: Option<Cow<'a, str>>,
66
67    #[encoder(id = "58")]
68    /// ISO3166-1 alpha 2 Country Code
69    pub country_code: Cow<'a, str>,
70
71    #[encoder(id = "59")]
72    /// Recipient's name
73    pub merchant_name: Cow<'a, str>,
74
75    #[encoder(id = "60")]
76    /// City where transaction occurred
77    pub merchant_city: Cow<'a, str>,
78
79    #[encoder(id = "61")]
80    /// Postal Code
81    pub postal_code: Option<Cow<'a, str>>,
82    /* #[encoder(id = "62")]
83     * pub additional_data: Option<AdditionalData<'a>>, */
84}
85
86#[cfg(test)]
87mod tests {
88    use super::*;
89
90    fn sample() -> &'static str {
91        "00020104141234567890123426580014BR.GOV.BCB.PIX0136123e4567-e12b-12d1-a456-42665544000027300012BR.COM.\
92         OUTRO011001234567895204000053039865406123.455802BR5917NOME DO \
93         RECEBEDOR6008BRASILIA61087007490062190515RP12345678-201980390012BR.COM.OUTRO01190123.ABCD.3456.WXYZ6304AD38"
94    }
95
96    #[test]
97    fn t_() {
98        let pix_schema_read = PixSchema::from_str(sample());
99
100        println!("schema: {:#?}", pix_schema_read);
101
102        assert_eq!(pix_schema_read.serialize_with_src(), sample())
103    }
104}