payment_strings/
lib.rs

1use serde::{Deserialize, Serialize};
2use std::fmt::Display;
3use std::str::FromStr;
4use strum::Display;
5use strum::EnumString;
6use strum::EnumVariantNames;
7use strum::VariantNames;
8
9pub trait EnumToHTML: FromStr + Display + PartialEq + Clone + VariantNames {
10    fn options() -> &'static [&'static str] {
11        Self::VARIANTS
12    }
13}
14
15#[derive(EnumString, Display, EnumVariantNames, PartialEq, Clone, Serialize, Deserialize)]
16pub enum Currency {
17    EUR,
18    CZK,
19    USD,
20    RUB,
21    CAD,
22    GBP,
23    JPY,
24}
25
26impl EnumToHTML for Currency {}
27
28#[derive(EnumString, Display, EnumVariantNames, PartialEq, Clone, Serialize, Deserialize)]
29pub enum PaymentEncoding {
30    SPD,
31    EPC,
32}
33
34impl EnumToHTML for PaymentEncoding {}
35
36#[derive(Clone, Serialize, Deserialize)]
37pub struct Payment {
38    pub iban: String,
39    pub swift: String,
40    pub amount: u32,
41    pub currency: Currency,
42    pub message: String,
43    pub recipient_name: String,
44}
45impl Payment {
46    /// SPD - Czech version of instant payment
47    fn spd_string(&self) -> String {
48        format!(
49            "SPD*1.0*ACC:{}*AM:{}*CC:{}*MSG:{}*RN:{}",
50            self.iban,
51            self.amount,
52            self.currency.to_string(),
53            self.message,
54            self.recipient_name
55        )
56    }
57    /// EPC - EU version of instant payment
58    fn epc_string(&self) -> String {
59        format!(
60            "BCD\n001\n1\nSCT\n{}\n{}\n{}\n{}{}\n{}\n",
61            self.swift,
62            self.recipient_name,
63            self.iban,
64            self.currency.to_string(),
65            self.amount,
66            self.message
67        )
68    }
69
70    pub fn string(&self, encoding: &PaymentEncoding) -> String {
71        match encoding {
72            PaymentEncoding::SPD => self.spd_string(),
73            PaymentEncoding::EPC => self.epc_string(),
74        }
75    }
76}