leim 0.2.0

A library to handle Legal Entity Identifiers (LEIs)
Documentation
/// A registration authority.
///
/// See <https://www.gleif.org/en/about-lei/code-lists/gleif-registration-authorities-list>
#[derive(Clone, Debug, PartialEq, Eq, serde::Deserialize)]
#[serde(try_from = "&str")]
pub struct RegistrationAuthority {
    index: usize,
}

impl serde::Serialize for RegistrationAuthority {
    fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
        REGISTRATION_AUTHORITIES
            .get(self.index)
            .unwrap()
            .serialize(serializer)
    }
}

impl TryFrom<&str> for RegistrationAuthority {
    type Error = crate::Error;
    fn try_from(from: &str) -> Result<Self, Self::Error> {
        if let Some(index) = ra_index(from) {
            Ok(Self { index })
        } else {
            Err(crate::Error::UnknownRegistrationAuthority(from.into()))
        }
    }
}

#[must_use]
fn ra_index(s: &str) -> Option<usize> {
    REGISTRATION_AUTHORITIES.binary_search(&s).ok()
}

// extracted from
// <https://www.gleif.org/about-lei/code-lists/gleif-registration-authorities-list/2022-03-23_ra_list_v1.7.xlsx>
// This list must be sorted for the above `ra_index` function to work.
const REGISTRATION_AUTHORITIES: [&str; 1037] = [
    "RA000001", "RA000002", "RA000003", "RA000004", "RA000005", "RA000006", "RA000007", "RA000008",
    "RA000009", "RA000010", "RA000011", "RA000012", "RA000013", "RA000014", "RA000015", "RA000016",
    "RA000017", "RA000018", "RA000019", "RA000020", "RA000021", "RA000022", "RA000023", "RA000024",
    "RA000025", "RA000026", "RA000027", "RA000028", "RA000029", "RA000030", "RA000031", "RA000032",
    "RA000033", "RA000034", "RA000035", "RA000036", "RA000037", "RA000038", "RA000039", "RA000040",
    "RA000041", "RA000042", "RA000043", "RA000044", "RA000045", "RA000046", "RA000047", "RA000048",
    "RA000049", "RA000050", "RA000051", "RA000052", "RA000053", "RA000054", "RA000055", "RA000056",
    "RA000057", "RA000058", "RA000059", "RA000060", "RA000061", "RA000062", "RA000063", "RA000064",
    "RA000065", "RA000066", "RA000067", "RA000068", "RA000069", "RA000070", "RA000071", "RA000072",
    "RA000073", "RA000074", "RA000075", "RA000076", "RA000077", "RA000078", "RA000079", "RA000080",
    "RA000081", "RA000082", "RA000083", "RA000084", "RA000085", "RA000086", "RA000087", "RA000088",
    "RA000089", "RA000090", "RA000091", "RA000092", "RA000093", "RA000094", "RA000095", "RA000096",
    "RA000097", "RA000098", "RA000099", "RA000100", "RA000101", "RA000102", "RA000103", "RA000104",
    "RA000105", "RA000106", "RA000107", "RA000108", "RA000109", "RA000110", "RA000111", "RA000112",
    "RA000113", "RA000114", "RA000115", "RA000116", "RA000117", "RA000118", "RA000119", "RA000120",
    "RA000121", "RA000122", "RA000123", "RA000124", "RA000125", "RA000126", "RA000127", "RA000128",
    "RA000129", "RA000130", "RA000131", "RA000132", "RA000133", "RA000134", "RA000135", "RA000136",
    "RA000137", "RA000138", "RA000139", "RA000140", "RA000141", "RA000142", "RA000143", "RA000144",
    "RA000145", "RA000146", "RA000147", "RA000148", "RA000149", "RA000150", "RA000151", "RA000152",
    "RA000153", "RA000154", "RA000155", "RA000156", "RA000157", "RA000158", "RA000159", "RA000160",
    "RA000161", "RA000162", "RA000163", "RA000164", "RA000165", "RA000166", "RA000167", "RA000168",
    "RA000169", "RA000170", "RA000171", "RA000172", "RA000173", "RA000174", "RA000175", "RA000176",
    "RA000177", "RA000178", "RA000179", "RA000180", "RA000181", "RA000182", "RA000183", "RA000184",
    "RA000185", "RA000186", "RA000187", "RA000188", "RA000189", "RA000189", "RA000189", "RA000189",
    "RA000189", "RA000189", "RA000189", "RA000189", "RA000189", "RA000189", "RA000189", "RA000189",
    "RA000190", "RA000192", "RA000192", "RA000192", "RA000192", "RA000192", "RA000192", "RA000192",
    "RA000192", "RA000192", "RA000192", "RA000192", "RA000192", "RA000193", "RA000195", "RA000196",
    "RA000197", "RA000199", "RA000200", "RA000201", "RA000202", "RA000203", "RA000204", "RA000205",
    "RA000206", "RA000207", "RA000208", "RA000209", "RA000210", "RA000213", "RA000214", "RA000215",
    "RA000216", "RA000217", "RA000218", "RA000219", "RA000220", "RA000221", "RA000222", "RA000224",
    "RA000225", "RA000226", "RA000227", "RA000228", "RA000229", "RA000230", "RA000231", "RA000232",
    "RA000233", "RA000234", "RA000235", "RA000236", "RA000238", "RA000239", "RA000240", "RA000241",
    "RA000242", "RA000243", "RA000244", "RA000245", "RA000246", "RA000247", "RA000249", "RA000250",
    "RA000251", "RA000252", "RA000253", "RA000255", "RA000257", "RA000258", "RA000259", "RA000260",
    "RA000261", "RA000262", "RA000263", "RA000266", "RA000267", "RA000268", "RA000269", "RA000271",
    "RA000272", "RA000273", "RA000274", "RA000275", "RA000276", "RA000277", "RA000278", "RA000279",
    "RA000280", "RA000281", "RA000282", "RA000283", "RA000284", "RA000285", "RA000286", "RA000287",
    "RA000288", "RA000289", "RA000290", "RA000291", "RA000293", "RA000295", "RA000296", "RA000297",
    "RA000298", "RA000299", "RA000300", "RA000301", "RA000302", "RA000303", "RA000304", "RA000305",
    "RA000306", "RA000307", "RA000308", "RA000309", "RA000310", "RA000311", "RA000313", "RA000314",
    "RA000315", "RA000316", "RA000317", "RA000319", "RA000320", "RA000321", "RA000322", "RA000324",
    "RA000325", "RA000328", "RA000329", "RA000331", "RA000332", "RA000333", "RA000334", "RA000336",
    "RA000337", "RA000338", "RA000339", "RA000342", "RA000343", "RA000344", "RA000345", "RA000346",
    "RA000347", "RA000348", "RA000349", "RA000350", "RA000351", "RA000352", "RA000353", "RA000354",
    "RA000355", "RA000356", "RA000358", "RA000362", "RA000363", "RA000364", "RA000365", "RA000368",
    "RA000369", "RA000370", "RA000371", "RA000372", "RA000373", "RA000374", "RA000375", "RA000376",
    "RA000377", "RA000378", "RA000379", "RA000381", "RA000382", "RA000383", "RA000384", "RA000385",
    "RA000386", "RA000387", "RA000388", "RA000389", "RA000390", "RA000391", "RA000392", "RA000393",
    "RA000394", "RA000395", "RA000396", "RA000397", "RA000398", "RA000399", "RA000400", "RA000401",
    "RA000402", "RA000403", "RA000404", "RA000405", "RA000406", "RA000407", "RA000408", "RA000409",
    "RA000410", "RA000411", "RA000412", "RA000413", "RA000414", "RA000415", "RA000416", "RA000417",
    "RA000418", "RA000419", "RA000420", "RA000421", "RA000422", "RA000423", "RA000424", "RA000425",
    "RA000426", "RA000427", "RA000428", "RA000429", "RA000430", "RA000431", "RA000432", "RA000433",
    "RA000434", "RA000435", "RA000436", "RA000437", "RA000438", "RA000439", "RA000441", "RA000442",
    "RA000443", "RA000444", "RA000446", "RA000447", "RA000449", "RA000451", "RA000452", "RA000453",
    "RA000454", "RA000455", "RA000456", "RA000457", "RA000458", "RA000459", "RA000460", "RA000461",
    "RA000462", "RA000463", "RA000464", "RA000466", "RA000467", "RA000468", "RA000469", "RA000470",
    "RA000471", "RA000472", "RA000473", "RA000474", "RA000475", "RA000476", "RA000477", "RA000478",
    "RA000479", "RA000480", "RA000481", "RA000482", "RA000483", "RA000484", "RA000485", "RA000486",
    "RA000487", "RA000488", "RA000489", "RA000493", "RA000494", "RA000495", "RA000497", "RA000498",
    "RA000499", "RA000500", "RA000502", "RA000503", "RA000504", "RA000508", "RA000509", "RA000510",
    "RA000511", "RA000512", "RA000513", "RA000514", "RA000515", "RA000516", "RA000517", "RA000518",
    "RA000519", "RA000520", "RA000521", "RA000522", "RA000523", "RA000524", "RA000525", "RA000526",
    "RA000527", "RA000528", "RA000529", "RA000530", "RA000531", "RA000532", "RA000533", "RA000534",
    "RA000535", "RA000536", "RA000537", "RA000538", "RA000539", "RA000540", "RA000541", "RA000542",
    "RA000543", "RA000544", "RA000545", "RA000546", "RA000547", "RA000548", "RA000548", "RA000549",
    "RA000550", "RA000551", "RA000552", "RA000553", "RA000554", "RA000555", "RA000556", "RA000557",
    "RA000558", "RA000560", "RA000561", "RA000562", "RA000563", "RA000564", "RA000565", "RA000566",
    "RA000567", "RA000568", "RA000569", "RA000570", "RA000571", "RA000572", "RA000573", "RA000574",
    "RA000575", "RA000576", "RA000577", "RA000578", "RA000579", "RA000580", "RA000581", "RA000582",
    "RA000583", "RA000584", "RA000585", "RA000586", "RA000587", "RA000588", "RA000589", "RA000590",
    "RA000591", "RA000592", "RA000593", "RA000594", "RA000595", "RA000596", "RA000597", "RA000598",
    "RA000599", "RA000600", "RA000601", "RA000602", "RA000603", "RA000604", "RA000605", "RA000606",
    "RA000607", "RA000608", "RA000609", "RA000610", "RA000611", "RA000612", "RA000613", "RA000614",
    "RA000615", "RA000616", "RA000617", "RA000618", "RA000619", "RA000620", "RA000621", "RA000622",
    "RA000623", "RA000624", "RA000625", "RA000626", "RA000627", "RA000628", "RA000629", "RA000630",
    "RA000631", "RA000632", "RA000633", "RA000634", "RA000635", "RA000636", "RA000637", "RA000638",
    "RA000639", "RA000640", "RA000641", "RA000642", "RA000643", "RA000644", "RA000645", "RA000646",
    "RA000647", "RA000648", "RA000649", "RA000650", "RA000651", "RA000652", "RA000653", "RA000654",
    "RA000655", "RA000656", "RA000657", "RA000658", "RA000659", "RA000660", "RA000661", "RA000662",
    "RA000663", "RA000664", "RA000665", "RA000665", "RA000665", "RA000665", "RA000666", "RA000667",
    "RA000668", "RA000669", "RA000670", "RA000671", "RA000672", "RA000673", "RA000674", "RA000675",
    "RA000676", "RA000677", "RA000678", "RA000679", "RA000680", "RA000681", "RA000682", "RA000683",
    "RA000684", "RA000685", "RA000686", "RA000687", "RA000689", "RA000690", "RA000691", "RA000692",
    "RA000693", "RA000694", "RA000695", "RA000696", "RA000697", "RA000698", "RA000699", "RA000700",
    "RA000701", "RA000702", "RA000703", "RA000704", "RA000705", "RA000706", "RA000707", "RA000708",
    "RA000709", "RA000710", "RA000711", "RA000712", "RA000713", "RA000714", "RA000715", "RA000716",
    "RA000717", "RA000718", "RA000719", "RA000720", "RA000721", "RA000722", "RA000723", "RA000725",
    "RA000726", "RA000727", "RA000728", "RA000729", "RA000730", "RA000731", "RA000732", "RA000733",
    "RA000734", "RA000735", "RA000736", "RA000737", "RA000738", "RA000739", "RA000740", "RA000741",
    "RA000742", "RA000743", "RA000744", "RA000745", "RA000745", "RA000745", "RA000745", "RA000746",
    "RA000747", "RA000748", "RA000749", "RA000750", "RA000751", "RA000752", "RA000753", "RA000754",
    "RA000756", "RA000757", "RA000758", "RA000759", "RA000760", "RA000761", "RA000762", "RA000763",
    "RA000764", "RA000765", "RA000766", "RA000767", "RA000768", "RA000769", "RA000770", "RA000771",
    "RA000772", "RA000773", "RA000774", "RA000775", "RA000776", "RA000777", "RA000778", "RA000779",
    "RA000780", "RA000781", "RA000782", "RA000783", "RA000784", "RA000785", "RA000786", "RA000787",
    "RA000788", "RA000789", "RA000790", "RA000791", "RA000792", "RA000793", "RA000794", "RA000795",
    "RA000797", "RA000798", "RA000799", "RA000800", "RA000801", "RA000802", "RA000804", "RA000805",
    "RA000806", "RA000807", "RA000808", "RA000809", "RA000810", "RA000811", "RA000812", "RA000813",
    "RA000814", "RA000814", "RA000814", "RA000814", "RA000814", "RA000814", "RA000814", "RA000814",
    "RA000815", "RA000816", "RA000817", "RA000818", "RA000819", "RA000820", "RA000821", "RA000822",
    "RA000823", "RA000824", "RA000825", "RA000826", "RA000827", "RA000828", "RA000829", "RA000829",
    "RA000829", "RA000829", "RA000829", "RA000829", "RA000830", "RA000831", "RA000832", "RA000833",
    "RA000834", "RA000835", "RA000836", "RA000837", "RA000838", "RA000839", "RA000840", "RA000841",
    "RA000842", "RA000843", "RA000844", "RA000845", "RA000846", "RA000847", "RA000848", "RA000849",
    "RA000850", "RA000851", "RA000852", "RA000853", "RA000854", "RA000855", "RA000855", "RA000856",
    "RA000857", "RA000858", "RA000860", "RA000861", "RA000862", "RA000863", "RA000864", "RA000865",
    "RA000867", "RA000868", "RA000869", "RA000870", "RA000871", "RA000872", "RA000873", "RA000874",
    "RA000875", "RA000876", "RA000877", "RA000878", "RA000879", "RA000880", "RA000881", "RA000882",
    "RA000883", "RA000884", "RA000885", "RA000886", "RA000887", "RA000888", "RA000889", "RA000890",
    "RA000891", "RA000892", "RA000893", "RA000894", "RA000895", "RA000896", "RA000897", "RA000898",
    "RA000900", "RA000901", "RA000902", "RA000903", "RA000904", "RA000905", "RA000906", "RA000907",
    "RA000908", "RA000909", "RA000910", "RA000911", "RA000912", "RA000913", "RA000914", "RA000915",
    "RA000916", "RA000917", "RA000918", "RA000919", "RA000920", "RA000921", "RA000922", "RA000923",
    "RA000925", "RA000926", "RA000927", "RA000928", "RA000929", "RA000930", "RA000931", "RA000932",
    "RA000933", "RA000934", "RA000935", "RA000936", "RA000937", "RA000938", "RA000939", "RA000940",
    "RA000941", "RA000942", "RA000943", "RA000944", "RA000945", "RA000946", "RA000947", "RA000948",
    "RA000949", "RA000950", "RA000951", "RA000952", "RA000953", "RA000954", "RA000955", "RA000956",
    "RA000957", "RA000958", "RA000959", "RA000960", "RA000961", "RA000962", "RA000963", "RA000964",
    "RA000964", "RA000965", "RA000966", "RA000967", "RA000968", "RA000969", "RA000970", "RA000971",
    "RA000972", "RA000973", "RA000974", "RA000975", "RA000976", "RA000977", "RA000978", "RA000979",
    "RA000980", "RA000981", "RA000982", "RA000983", "RA000984", "RA000985", "RA000986", "RA000987",
    "RA000988", "RA000989", "RA000990", "RA000991", "RA000992", "RA000993", "RA000994", "RA000995",
    "RA000996", "RA000997", "RA000998", "RA000999", "RA001000", "RA001001", "RA001002", "RA001003",
    "RA001004", "RA001005", "RA001006", "RA001007", "RA001008", "RA001009", "RA001010", "RA001011",
    "RA001012", "RA001013", "RA001014", "RA001015", "RA001016", "RA001017", "RA001018", "RA001019",
    "RA001020", "RA001021", "RA001022", "RA001023", "RA001024", "RA001025", "RA001026", "RA001027",
    "RA001028", "RA001029", "RA001030", "RA001031", "RA001032", "RA001033", "RA001034", "RA001035",
    "RA001036", "RA001037", "RA001038", "RA001039", "RA001040", "RA001041", "RA001042", "RA001043",
    "RA001044", "RA001045", "RA777777", "RA888888", "RA999999",
];

#[cfg(test)]
mod tests {
    use super::*;
    use serde_test::{assert_tokens, Token};

    #[test]
    fn test_ra_index() {
        assert!(ra_index("RA000001").is_some());
        assert!(ra_index("RA888888").is_some());
        assert!(ra_index("RA999999").is_some());
        assert_eq!(ra_index("RA100001"), None);
    }

    #[test]
    fn test_registration_authority_invalid_length() {
        serde_test::assert_de_tokens_error::<RegistrationAuthority>(
            &[Token::BorrowedStr("RA00009")],
            "unknown registration authority: RA00009",
        );
        serde_test::assert_de_tokens_error::<RegistrationAuthority>(
            &[Token::BorrowedStr("RA0000945")],
            "unknown registration authority: RA0000945",
        );
    }

    #[test]
    fn test_registration_authority_invalid_value() {
        assert!(RegistrationAuthority::try_from("RA100094").is_err());
    }

    #[test]
    fn test_registration_authority() {
        let ra: RegistrationAuthority = "RA000094".try_into().unwrap();
        assert_tokens(&ra, &[Token::BorrowedStr("RA000094")]);
    }

    #[test]
    fn test_registration_authorities_are_sorted() {
        let mut authorities = REGISTRATION_AUTHORITIES;
        authorities.sort_unstable();
        assert_eq!(authorities, REGISTRATION_AUTHORITIES);
    }
}