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 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 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}