#[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()
}
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);
}
}