use core::fmt;
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub struct CountryCode {
pub a: u8,
pub b: u8,
}
impl CountryCode {
pub fn new(code: &str) -> Option<Self> {
let bytes = code.as_bytes();
if bytes.len() != 2 {
return None;
}
let a = bytes[0].to_ascii_uppercase();
let b = bytes[1].to_ascii_uppercase();
if !(b'A'..=b'Z').contains(&a) || !(b'A'..=b'Z').contains(&b) {
return None;
}
Some(Self { a, b })
}
pub fn as_bytes(&self) -> [u8; 2] {
[self.a, self.b]
}
pub fn to_string(&self) -> String {
let mut s = String::with_capacity(2);
s.push(self.a as char);
s.push(self.b as char);
s
}
pub fn flag(&self) -> Option<String> {
let base = 0x1F1E6u32; let a = base + (self.a as u32 - 'A' as u32);
let b = base + (self.b as u32 - 'A' as u32);
let ca = char::from_u32(a)?;
let cb = char::from_u32(b)?;
let mut out = String::new();
out.push(ca);
out.push(cb);
Some(out)
}
}
impl fmt::Display for CountryCode {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}{}", self.a as char, self.b as char)
}
}