stripe_types/
currency.rs

1#![allow(missing_docs)]
2
3use std::convert::Infallible;
4use std::str::FromStr;
5
6use serde::Serialize;
7
8/// Currency is the list of supported currencies.
9///
10/// For more details see <https://support.stripe.com/questions/which-currencies-does-stripe-support>.
11#[derive(Clone, Debug, Eq, Serialize, PartialEq, Hash, Default)]
12pub enum Currency {
13    #[serde(rename = "byn")]
14    BYN, // Belarusian Ruble
15    #[serde(rename = "mmk")]
16    MMK, // Myanmar Kyat
17    #[serde(rename = "aed")]
18    AED, // United Arab Emirates Dirham
19    #[serde(rename = "afn")]
20    AFN, // Afghan Afghani
21    #[serde(rename = "all")]
22    ALL, // Albanian Lek
23    #[serde(rename = "amd")]
24    AMD, // Armenian Dram
25    #[serde(rename = "ang")]
26    ANG, // Netherlands Antillean Gulden
27    #[serde(rename = "aoa")]
28    AOA, // Angolan Kwanza
29    #[serde(rename = "ars")]
30    ARS, // Argentine Peso
31    #[serde(rename = "aud")]
32    AUD, // Australian Dollar
33    #[serde(rename = "awg")]
34    AWG, // Aruban Florin
35    #[serde(rename = "azn")]
36    AZN, // Azerbaijani Manat
37    #[serde(rename = "bam")]
38    BAM, // Bosnia & Herzegovina Convertible Mark
39    #[serde(rename = "bbd")]
40    BBD, // Barbadian Dollar
41    #[serde(rename = "bdt")]
42    BDT, // Bangladeshi Taka
43    #[serde(rename = "bgn")]
44    BGN, // Bulgarian Lev
45    #[serde(rename = "bif")]
46    BIF, // Burundian Franc
47    #[serde(rename = "bmd")]
48    BMD, // Bermudian Dollar
49    #[serde(rename = "bnd")]
50    BND, // Brunei Dollar
51    #[serde(rename = "bob")]
52    BOB, // Bolivian Boliviano
53    #[serde(rename = "brl")]
54    BRL, // Brazilian Real
55    #[serde(rename = "bsd")]
56    BSD, // Bahamian Dollar
57    #[serde(rename = "bwp")]
58    BWP, // Botswana Pula
59    #[serde(rename = "bzd")]
60    BZD, // Belize Dollar
61    #[serde(rename = "cad")]
62    CAD, // Canadian Dollar
63    #[serde(rename = "cdf")]
64    CDF, // Congolese Franc
65    #[serde(rename = "chf")]
66    CHF, // Swiss Franc
67    #[serde(rename = "clp")]
68    CLP, // Chilean Peso
69    #[serde(rename = "cny")]
70    CNY, // Chinese Renminbi Yuan
71    #[serde(rename = "cop")]
72    COP, // Colombian Peso
73    #[serde(rename = "crc")]
74    CRC, // Costa Rican Colón
75    #[serde(rename = "cve")]
76    CVE, // Cape Verdean Escudo
77    #[serde(rename = "czk")]
78    CZK, // Czech Koruna
79    #[serde(rename = "djf")]
80    DJF, // Djiboutian Franc
81    #[serde(rename = "dkk")]
82    DKK, // Danish Krone
83    #[serde(rename = "dop")]
84    DOP, // Dominican Peso
85    #[serde(rename = "dzd")]
86    DZD, // Algerian Dinar
87    #[serde(rename = "eek")]
88    EEK, // Estonian Kroon
89    #[serde(rename = "egp")]
90    EGP, // Egyptian Pound
91    #[serde(rename = "etb")]
92    ETB, // Ethiopian Birr
93    #[serde(rename = "eur")]
94    EUR, // Euro
95    #[serde(rename = "fjd")]
96    FJD, // Fijian Dollar
97    #[serde(rename = "fkp")]
98    FKP, // Falkland Islands Pound
99    #[serde(rename = "gbp")]
100    GBP, // British Pound
101    #[serde(rename = "gel")]
102    GEL, // Georgian Lari
103    #[serde(rename = "gip")]
104    GIP, // Gibraltar Pound
105    #[serde(rename = "gmd")]
106    GMD, // Gambian Dalasi
107    #[serde(rename = "gnf")]
108    GNF, // Guinean Franc
109    #[serde(rename = "gtq")]
110    GTQ, // Guatemalan Quetzal
111    #[serde(rename = "gyd")]
112    GYD, // Guyanese Dollar
113    #[serde(rename = "hkd")]
114    HKD, // Hong Kong Dollar
115    #[serde(rename = "hnl")]
116    HNL, // Honduran Lempira
117    #[serde(rename = "hrk")]
118    HRK, // Croatian Kuna
119    #[serde(rename = "htg")]
120    HTG, // Haitian Gourde
121    #[serde(rename = "huf")]
122    HUF, // Hungarian Forint
123    #[serde(rename = "idr")]
124    IDR, // Indonesian Rupiah
125    #[serde(rename = "ils")]
126    ILS, // Israeli New Sheqel
127    #[serde(rename = "inr")]
128    INR, // Indian Rupee
129    #[serde(rename = "isk")]
130    ISK, // Icelandic Króna
131    #[serde(rename = "jmd")]
132    JMD, // Jamaican Dollar
133    #[serde(rename = "jpy")]
134    JPY, // Japanese Yen
135    #[serde(rename = "kes")]
136    KES, // Kenyan Shilling
137    #[serde(rename = "kgs")]
138    KGS, // Kyrgyzstani Som
139    #[serde(rename = "khr")]
140    KHR, // Cambodian Riel
141    #[serde(rename = "kmf")]
142    KMF, // Comorian Franc
143    #[serde(rename = "krw")]
144    KRW, // South Korean Won
145    #[serde(rename = "kyd")]
146    KYD, // Cayman Islands Dollar
147    #[serde(rename = "kzt")]
148    KZT, // Kazakhstani Tenge
149    #[serde(rename = "lak")]
150    LAK, // Lao Kip
151    #[serde(rename = "lbp")]
152    LBP, // Lebanese Pound
153    #[serde(rename = "lkr")]
154    LKR, // Sri Lankan Rupee
155    #[serde(rename = "lrd")]
156    LRD, // Liberian Dollar
157    #[serde(rename = "lsl")]
158    LSL, // Lesotho Loti
159    #[serde(rename = "ltl")]
160    LTL, // Lithuanian Litas
161    #[serde(rename = "lvl")]
162    LVL, // Latvian Lats
163    #[serde(rename = "mad")]
164    MAD, // Moroccan Dirham
165    #[serde(rename = "mdl")]
166    MDL, // Moldovan Leu
167    #[serde(rename = "mga")]
168    MGA, // Malagasy Ariary
169    #[serde(rename = "mkd")]
170    MKD, // Macedonian Denar
171    #[serde(rename = "mnt")]
172    MNT, // Mongolian Tögrög
173    #[serde(rename = "mop")]
174    MOP, // Macanese Pataca
175    #[serde(rename = "mro")]
176    MRO, // Mauritanian Ouguiya
177    #[serde(rename = "mur")]
178    MUR, // Mauritian Rupee
179    #[serde(rename = "mvr")]
180    MVR, // Maldivian Rufiyaa
181    #[serde(rename = "mwk")]
182    MWK, // Malawian Kwacha
183    #[serde(rename = "mxn")]
184    MXN, // Mexican Peso
185    #[serde(rename = "myr")]
186    MYR, // Malaysian Ringgit
187    #[serde(rename = "mzn")]
188    MZN, // Mozambican Metical
189    #[serde(rename = "nad")]
190    NAD, // Namibian Dollar
191    #[serde(rename = "ngn")]
192    NGN, // Nigerian Naira
193    #[serde(rename = "nio")]
194    NIO, // Nicaraguan Córdoba
195    #[serde(rename = "nok")]
196    NOK, // Norwegian Krone
197    #[serde(rename = "npr")]
198    NPR, // Nepalese Rupee
199    #[serde(rename = "nzd")]
200    NZD, // New Zealand Dollar
201    #[serde(rename = "pab")]
202    PAB, // Panamanian Balboa
203    #[serde(rename = "pen")]
204    PEN, // Peruvian Nuevo Sol
205    #[serde(rename = "pgk")]
206    PGK, // Papua New Guinean Kina
207    #[serde(rename = "php")]
208    PHP, // Philippine Peso
209    #[serde(rename = "pkr")]
210    PKR, // Pakistani Rupee
211    #[serde(rename = "pln")]
212    PLN, // Polish Złoty
213    #[serde(rename = "pyg")]
214    PYG, // Paraguayan Guaraní
215    #[serde(rename = "qar")]
216    QAR, // Qatari Riyal
217    #[serde(rename = "ron")]
218    RON, // Romanian Leu
219    #[serde(rename = "rsd")]
220    RSD, // Serbian Dinar
221    #[serde(rename = "rub")]
222    RUB, // Russian Ruble
223    #[serde(rename = "rwf")]
224    RWF, // Rwandan Franc
225    #[serde(rename = "sar")]
226    SAR, // Saudi Riyal
227    #[serde(rename = "sbd")]
228    SBD, // Solomon Islands Dollar
229    #[serde(rename = "scr")]
230    SCR, // Seychellois Rupee
231    #[serde(rename = "sek")]
232    SEK, // Swedish Krona
233    #[serde(rename = "sgd")]
234    SGD, // Singapore Dollar
235    #[serde(rename = "shp")]
236    SHP, // Saint Helenian Pound
237    #[serde(rename = "sll")]
238    SLL, // Sierra Leonean Leone
239    #[serde(rename = "sos")]
240    SOS, // Somali Shilling
241    #[serde(rename = "srd")]
242    SRD, // Surinamese Dollar
243    #[serde(rename = "std")]
244    STD, // São Tomé and Príncipe Dobra
245    #[serde(rename = "svc")]
246    SVC, // Salvadoran Colón
247    #[serde(rename = "szl")]
248    SZL, // Swazi Lilangeni
249    #[serde(rename = "thb")]
250    THB, // Thai Baht
251    #[serde(rename = "tjs")]
252    TJS, // Tajikistani Somoni
253    #[serde(rename = "top")]
254    TOP, // Tongan Paʻanga
255    #[serde(rename = "try")]
256    TRY, // Turkish Lira
257    #[serde(rename = "ttd")]
258    TTD, // Trinidad and Tobago Dollar
259    #[serde(rename = "twd")]
260    TWD, // New Taiwan Dollar
261    #[serde(rename = "tzs")]
262    TZS, // Tanzanian Shilling
263    #[serde(rename = "uah")]
264    UAH, // Ukrainian Hryvnia
265    #[serde(rename = "ugx")]
266    UGX, // Ugandan Shilling
267    #[serde(rename = "usd")]
268    #[default]
269    USD, // United States Dollar
270    #[serde(rename = "uyu")]
271    UYU, // Uruguayan Peso
272    #[serde(rename = "uzs")]
273    UZS, // Uzbekistani Som
274    #[serde(rename = "vef")]
275    VEF, // Venezuelan Bolívar
276    #[serde(rename = "vnd")]
277    VND, // Vietnamese Đồng
278    #[serde(rename = "vuv")]
279    VUV, // Vanuatu Vatu
280    #[serde(rename = "wst")]
281    WST, // Samoan Tala
282    #[serde(rename = "xaf")]
283    XAF, // Central African Cfa Franc
284    #[serde(rename = "xcd")]
285    XCD, // East Caribbean Dollar
286    #[serde(rename = "xof")]
287    XOF, // West African Cfa Franc
288    #[serde(rename = "xpf")]
289    XPF, // Cfp Franc
290    #[serde(rename = "yer")]
291    YER, // Yemeni Rial
292    #[serde(rename = "zar")]
293    ZAR, // South African Rand
294    #[serde(rename = "zmw")]
295    ZMW, // Zambian Kwacha
296    #[serde(untagged)]
297    Unknown(String),
298}
299
300impl std::fmt::Display for Currency {
301    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
302        write!(f, "{}", format!("{self:?}").to_ascii_lowercase())
303    }
304}
305
306miniserde::make_place!(Place);
307
308impl miniserde::Deserialize for Currency {
309    fn begin(out: &mut Option<Self>) -> &mut dyn miniserde::de::Visitor {
310        Place::new(out)
311    }
312}
313
314impl miniserde::de::Visitor for Place<Currency> {
315    fn string(&mut self, s: &str) -> miniserde::Result<()> {
316        self.out = Some(Currency::from_str(s).unwrap());
317        Ok(())
318    }
319}
320
321#[cfg(feature = "deserialize")]
322impl<'de> serde::Deserialize<'de> for Currency {
323    fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
324        use std::str::FromStr;
325        let s: std::borrow::Cow<'de, str> = serde::Deserialize::deserialize(deserializer)?;
326        Ok(Self::from_str(&s).unwrap())
327    }
328}
329
330impl std::str::FromStr for Currency {
331    type Err = Infallible;
332    fn from_str(s: &str) -> Result<Self, Self::Err> {
333        match s {
334            "byn" => Ok(Currency::BYN),
335            "mmk" => Ok(Currency::MMK),
336            "aed" => Ok(Currency::AED),
337            "afn" => Ok(Currency::AFN),
338            "all" => Ok(Currency::ALL),
339            "amd" => Ok(Currency::AMD),
340            "ang" => Ok(Currency::ANG),
341            "aoa" => Ok(Currency::AOA),
342            "ars" => Ok(Currency::ARS),
343            "aud" => Ok(Currency::AUD),
344            "awg" => Ok(Currency::AWG),
345            "azn" => Ok(Currency::AZN),
346            "bam" => Ok(Currency::BAM),
347            "bbd" => Ok(Currency::BBD),
348            "bdt" => Ok(Currency::BDT),
349            "bgn" => Ok(Currency::BGN),
350            "bif" => Ok(Currency::BIF),
351            "bmd" => Ok(Currency::BMD),
352            "bnd" => Ok(Currency::BND),
353            "bob" => Ok(Currency::BOB),
354            "brl" => Ok(Currency::BRL),
355            "bsd" => Ok(Currency::BSD),
356            "bwp" => Ok(Currency::BWP),
357            "bzd" => Ok(Currency::BZD),
358            "cad" => Ok(Currency::CAD),
359            "cdf" => Ok(Currency::CDF),
360            "chf" => Ok(Currency::CHF),
361            "clp" => Ok(Currency::CLP),
362            "cny" => Ok(Currency::CNY),
363            "cop" => Ok(Currency::COP),
364            "crc" => Ok(Currency::CRC),
365            "cve" => Ok(Currency::CVE),
366            "czk" => Ok(Currency::CZK),
367            "djf" => Ok(Currency::DJF),
368            "dkk" => Ok(Currency::DKK),
369            "dop" => Ok(Currency::DOP),
370            "dzd" => Ok(Currency::DZD),
371            "eek" => Ok(Currency::EEK),
372            "egp" => Ok(Currency::EGP),
373            "etb" => Ok(Currency::ETB),
374            "eur" => Ok(Currency::EUR),
375            "fjd" => Ok(Currency::FJD),
376            "fkp" => Ok(Currency::FKP),
377            "gbp" => Ok(Currency::GBP),
378            "gel" => Ok(Currency::GEL),
379            "gip" => Ok(Currency::GIP),
380            "gmd" => Ok(Currency::GMD),
381            "gnf" => Ok(Currency::GNF),
382            "gtq" => Ok(Currency::GTQ),
383            "gyd" => Ok(Currency::GYD),
384            "hkd" => Ok(Currency::HKD),
385            "hnl" => Ok(Currency::HNL),
386            "hrk" => Ok(Currency::HRK),
387            "htg" => Ok(Currency::HTG),
388            "huf" => Ok(Currency::HUF),
389            "idr" => Ok(Currency::IDR),
390            "ils" => Ok(Currency::ILS),
391            "inr" => Ok(Currency::INR),
392            "isk" => Ok(Currency::ISK),
393            "jmd" => Ok(Currency::JMD),
394            "jpy" => Ok(Currency::JPY),
395            "kes" => Ok(Currency::KES),
396            "kgs" => Ok(Currency::KGS),
397            "khr" => Ok(Currency::KHR),
398            "kmf" => Ok(Currency::KMF),
399            "krw" => Ok(Currency::KRW),
400            "kyd" => Ok(Currency::KYD),
401            "kzt" => Ok(Currency::KZT),
402            "lak" => Ok(Currency::LAK),
403            "lbp" => Ok(Currency::LBP),
404            "lkr" => Ok(Currency::LKR),
405            "lrd" => Ok(Currency::LRD),
406            "lsl" => Ok(Currency::LSL),
407            "ltl" => Ok(Currency::LTL),
408            "lvl" => Ok(Currency::LVL),
409            "mad" => Ok(Currency::MAD),
410            "mdl" => Ok(Currency::MDL),
411            "mga" => Ok(Currency::MGA),
412            "mkd" => Ok(Currency::MKD),
413            "mnt" => Ok(Currency::MNT),
414            "mop" => Ok(Currency::MOP),
415            "mro" => Ok(Currency::MRO),
416            "mur" => Ok(Currency::MUR),
417            "mvr" => Ok(Currency::MVR),
418            "mwk" => Ok(Currency::MWK),
419            "mxn" => Ok(Currency::MXN),
420            "myr" => Ok(Currency::MYR),
421            "mzn" => Ok(Currency::MZN),
422            "nad" => Ok(Currency::NAD),
423            "ngn" => Ok(Currency::NGN),
424            "nio" => Ok(Currency::NIO),
425            "nok" => Ok(Currency::NOK),
426            "npr" => Ok(Currency::NPR),
427            "nzd" => Ok(Currency::NZD),
428            "pab" => Ok(Currency::PAB),
429            "pen" => Ok(Currency::PEN),
430            "pgk" => Ok(Currency::PGK),
431            "php" => Ok(Currency::PHP),
432            "pkr" => Ok(Currency::PKR),
433            "pln" => Ok(Currency::PLN),
434            "pyg" => Ok(Currency::PYG),
435            "qar" => Ok(Currency::QAR),
436            "ron" => Ok(Currency::RON),
437            "rsd" => Ok(Currency::RSD),
438            "rub" => Ok(Currency::RUB),
439            "rwf" => Ok(Currency::RWF),
440            "sar" => Ok(Currency::SAR),
441            "sbd" => Ok(Currency::SBD),
442            "scr" => Ok(Currency::SCR),
443            "sek" => Ok(Currency::SEK),
444            "sgd" => Ok(Currency::SGD),
445            "shp" => Ok(Currency::SHP),
446            "sll" => Ok(Currency::SLL),
447            "sos" => Ok(Currency::SOS),
448            "srd" => Ok(Currency::SRD),
449            "std" => Ok(Currency::STD),
450            "svc" => Ok(Currency::SVC),
451            "szl" => Ok(Currency::SZL),
452            "thb" => Ok(Currency::THB),
453            "tjs" => Ok(Currency::TJS),
454            "top" => Ok(Currency::TOP),
455            "try" => Ok(Currency::TRY),
456            "ttd" => Ok(Currency::TTD),
457            "twd" => Ok(Currency::TWD),
458            "tzs" => Ok(Currency::TZS),
459            "uah" => Ok(Currency::UAH),
460            "ugx" => Ok(Currency::UGX),
461            "usd" => Ok(Currency::USD),
462            "uyu" => Ok(Currency::UYU),
463            "uzs" => Ok(Currency::UZS),
464            "vef" => Ok(Currency::VEF),
465            "vnd" => Ok(Currency::VND),
466            "vuv" => Ok(Currency::VUV),
467            "wst" => Ok(Currency::WST),
468            "xaf" => Ok(Currency::XAF),
469            "xcd" => Ok(Currency::XCD),
470            "xof" => Ok(Currency::XOF),
471            "xpf" => Ok(Currency::XPF),
472            "yer" => Ok(Currency::YER),
473            "zar" => Ok(Currency::ZAR),
474            "zmw" => Ok(Currency::ZMW),
475            _ => Ok(Currency::Unknown(s.to_string())),
476        }
477    }
478}
479
480#[cfg(test)]
481mod tests {
482    use super::*;
483    #[test]
484    fn debug_currency() {
485        assert_eq!(format!("{:?}", Currency::AED), "AED");
486        assert_eq!(format!("{:?}", Currency::USD), "USD");
487        assert_eq!(format!("{:?}", Currency::ZMW), "ZMW");
488    }
489
490    #[test]
491    fn display_currency() {
492        assert_eq!(format!("{}", Currency::AED), "aed");
493        assert_eq!(format!("{}", Currency::USD), "usd");
494        assert_eq!(format!("{}", Currency::ZMW), "zmw");
495    }
496
497    #[test]
498    fn serialize_currency() {
499        assert_eq!(serde_json::to_string(&Currency::AED).unwrap(), "\"aed\"");
500        assert_eq!(serde_json::to_string(&Currency::USD).unwrap(), "\"usd\"");
501        assert_eq!(serde_json::to_string(&Currency::ZMW).unwrap(), "\"zmw\"");
502    }
503
504    #[test]
505    fn deserialize_currency() {
506        assert_eq!(miniserde::json::from_str::<Currency>("\"aed\"").unwrap(), Currency::AED);
507        assert_eq!(miniserde::json::from_str::<Currency>("\"usd\"").unwrap(), Currency::USD);
508        assert_eq!(miniserde::json::from_str::<Currency>("\"zmw\"").unwrap(), Currency::ZMW);
509    }
510}