1use internment::Intern;
2use pyo3::exceptions::PyValueError;
3use pyo3::{pyclass, PyErr};
4use serde::{Deserialize, Serialize};
5
6#[pyclass(module = "rateslib.rs")]
8#[derive(Copy, Clone, Debug, Eq, PartialEq, Hash, Serialize, Deserialize)]
9pub struct Ccy {
10    pub(crate) name: Intern<String>,
11}
12
13impl Ccy {
14    pub fn try_new(name: &str) -> Result<Self, PyErr> {
21        let ccy: String = name.to_string().to_lowercase();
22        if ccy.len() != 3 {
23            return Err(PyValueError::new_err(
24                "`Ccy` must be 3 ascii character in length, e.g. 'usd'.",
25            ));
26        }
27        Ok(Ccy {
28            name: Intern::new(ccy),
29        })
30    }
31}
32
33#[cfg(test)]
34mod tests {
35    use super::*;
36
37    #[test]
38    fn ccy_creation() {
39        let a = Ccy::try_new("usd").unwrap();
40        let b = Ccy::try_new("USD").unwrap();
41        assert_eq!(a, b)
42    }
43
44    #[test]
45    fn ccy_creation_error() {
46        match Ccy::try_new("FOUR") {
47            Ok(_) => assert!(false),
48            Err(_) => assert!(true),
49        }
50    }
51}