pix_brcode/
qr_dinamico.rs1use std::borrow::Cow;
2
3use emv_qrcps::EmvEncoder;
4
5#[derive(EmvEncoder, Clone, Debug)]
6pub struct AdditionalData<'a> {
7 #[encoder(id = "05")]
8 txid: Cow<'a, str>,
11}
12
13#[derive(EmvEncoder, Clone, Debug)]
14pub struct MerchantAccountInformation<'a> {
15 #[encoder(id = "00")]
17 pub merchant_gui: Cow<'a, str>,
18
19 #[encoder(id = "25")]
22 pub merchant_location_url: Cow<'a, str>,
23}
24
25#[derive(EmvEncoder, Clone, Debug)]
26pub struct PixDinamicoSchema<'a> {
27 #[encoder(id = "00")]
29 pub format_indicator: Cow<'a, str>,
30
31 #[encoder(id = "01")]
34 pub point_of_initiation_method: Option<Cow<'a, str>>,
35
36 #[encoder(id = "26")]
37 pub merchant_account_information: MerchantAccountInformation<'a>,
38
39 #[encoder(id = "52")]
40 pub merchant_category_code: Cow<'a, str>,
42
43 #[encoder(id = "53")]
45 pub transaction_currency: Cow<'a, str>,
46
47 #[encoder(id = "54")]
48 pub transaction_amount: Option<Cow<'a, str>>,
49
50 #[encoder(id = "58")]
53 pub country_code: Cow<'a, str>,
54
55 #[encoder(id = "59")]
57 pub merchant_name: Cow<'a, str>,
58
59 #[encoder(id = "60")]
61 pub merchant_city: Cow<'a, str>,
62
63 #[encoder(id = "61")]
64 pub postal_code: Option<Cow<'a, str>>,
65
66 #[encoder(id = "62")]
67 pub additional_data: AdditionalData<'a>,
68}
69
70impl<'a> PixDinamicoSchema<'a> {
71 pub fn standard<MA, MC, TA, L>(merchant_name: MA, merchant_city: MC, transaction_amount: TA, location: L) -> Self
73 where
74 MA: Into<Cow<'a, str>>,
75 MC: Into<Cow<'a, str>>,
76 TA: Into<Cow<'a, str>>,
77 L: Into<Cow<'a, str>>,
78 {
79 let merchant = MerchantAccountInformation {
80 merchant_gui: "br.gov.bcb.pix".into(),
81 merchant_location_url: location.into(),
82 };
83
84 let additional_data = AdditionalData { txid: "***".into() };
85
86 Self {
87 format_indicator: "01".into(),
88 point_of_initiation_method: Some("12".into()),
89
90 merchant_account_information: merchant,
91 merchant_category_code: "0000".into(),
92 transaction_currency: "986".into(),
93 transaction_amount: Some(transaction_amount.into()),
94 country_code: "BR".into(),
95 merchant_name: merchant_name.into(),
96 merchant_city: merchant_city.into(),
97 postal_code: None,
98 additional_data,
99 }
100 }
101}