currency_code/
iso4217.rs

1//! [ISO 4217 - Wikipedia](https://en.wikipedia.org/wiki/ISO_4217)
2
3use crate::currency_code;
4
5currency_code! {
6    #[derive(Debug, Clone)]
7    pub enum CurrencyCode {
8        AED,
9        AFN,
10        ALL,
11        AMD,
12        ANG,
13        AOA,
14        ARS,
15        AUD,
16        AWG,
17        AZN,
18        BAM,
19        BBD,
20        BDT,
21        BGN,
22        BHD,
23        BIF,
24        BMD,
25        BND,
26        BOB,
27        BOV,
28        BRL,
29        BSD,
30        BTN,
31        BWP,
32        BYN,
33        BZD,
34        CAD,
35        CDF,
36        CHE,
37        CHF,
38        CHW,
39        CLF,
40        CLP,
41        CNY,
42        COP,
43        COU,
44        CRC,
45        CUC,
46        CUP,
47        CVE,
48        CZK,
49        DJF,
50        DKK,
51        DOP,
52        DZD,
53        EGP,
54        ERN,
55        ETB,
56        EUR,
57        FJD,
58        FKP,
59        GBP,
60        GEL,
61        GHS,
62        GIP,
63        GMD,
64        GNF,
65        GTQ,
66        GYD,
67        HKD,
68        HNL,
69        HRK,
70        HTG,
71        HUF,
72        IDR,
73        ILS,
74        INR,
75        IQD,
76        IRR,
77        ISK,
78        JMD,
79        JOD,
80        JPY,
81        KES,
82        KGS,
83        KHR,
84        KMF,
85        KPW,
86        KRW,
87        KWD,
88        KYD,
89        KZT,
90        LAK,
91        LBP,
92        LKR,
93        LRD,
94        LSL,
95        LYD,
96        MAD,
97        MDL,
98        MGA,
99        MKD,
100        MMK,
101        MNT,
102        MOP,
103        MRU,
104        MUR,
105        MVR,
106        MWK,
107        MXN,
108        MXV,
109        MYR,
110        MZN,
111        NAD,
112        NGN,
113        NIO,
114        NOK,
115        NPR,
116        NZD,
117        OMR,
118        PAB,
119        PEN,
120        PGK,
121        PHP,
122        PKR,
123        PLN,
124        PYG,
125        QAR,
126        RON,
127        RSD,
128        RUB,
129        RWF,
130        SAR,
131        SBD,
132        SCR,
133        SDG,
134        SEK,
135        SGD,
136        SHP,
137        SLL,
138        SOS,
139        SRD,
140        SSP,
141        STN,
142        SVC,
143        SYP,
144        SZL,
145        THB,
146        TJS,
147        TMT,
148        TND,
149        TOP,
150        TRY,
151        TTD,
152        TWD,
153        TZS,
154        UAH,
155        UGX,
156        USD,
157        USN,
158        UYI,
159        UYU,
160        UYW,
161        UZS,
162        VED,
163        VES,
164        VND,
165        VUV,
166        WST,
167        XAF,
168        XAG,
169        XAU,
170        XBA,
171        XBB,
172        XBC,
173        XBD,
174        XCD,
175        XDR,
176        XOF,
177        XPD,
178        XPF,
179        XPT,
180        XSU,
181        XTS,
182        XUA,
183        XXX,
184        YER,
185        ZAR,
186        ZMW,
187        ZWL,
188    }
189}
190
191#[cfg(test)]
192mod tests {
193    use super::*;
194
195    use alloc::string::ToString as _;
196
197    use csv::Reader;
198
199    #[test]
200    fn test_currency_code() {
201        // Wikipedia
202        let mut rdr =
203            Reader::from_reader(include_str!("../tests/ISO_4217/Active_codes.csv").as_bytes());
204
205        let mut n = 0;
206        for record in rdr.records() {
207            let record = record.unwrap();
208            let code = &record[0];
209            let code = &code[0..3];
210            assert_eq!(code.parse::<CurrencyCode>().unwrap().to_string(), code);
211            n += 1;
212        }
213
214        assert_eq!(CurrencyCode::VARS.len(), n);
215
216        // FromStr
217        assert_eq!(
218            "ZZZ".parse::<CurrencyCode>().unwrap(),
219            CurrencyCode::Other("ZZZ".into())
220        );
221        assert_eq!(
222            "x".parse::<CurrencyCode>().err().unwrap(),
223            crate::error::ParseError::Invalid("x".into())
224        );
225        #[cfg(feature = "std")]
226        {
227            std::println!("{}", "x".parse::<CurrencyCode>().err().unwrap());
228        }
229
230        // PartialEq
231        assert_eq!(CurrencyCode::USD, CurrencyCode::USD);
232        assert_eq!(CurrencyCode::USD, CurrencyCode::Other("USD".into()));
233        assert_eq!(CurrencyCode::USD, "USD");
234
235        #[cfg(feature = "std")]
236        {
237            // Hash
238            let mut h = std::collections::HashSet::new();
239            h.insert(CurrencyCode::USD);
240            h.insert(CurrencyCode::Other("USD".into()));
241            assert_eq!(h.len(), 1);
242        }
243
244        #[cfg(feature = "serde")]
245        {
246            #[derive(serde::Serialize, serde::Deserialize)]
247            struct Foo {
248                code: CurrencyCode,
249            }
250
251            assert_eq!(
252                serde_json::from_str::<Foo>(r#"{"code":"USD"}"#)
253                    .unwrap()
254                    .code,
255                CurrencyCode::USD
256            );
257            assert_eq!(
258                serde_json::to_string(&Foo {
259                    code: CurrencyCode::USD
260                })
261                .unwrap(),
262                r#"{"code":"USD"}"#
263            );
264        }
265    }
266}