use std::{
fmt::{self, Display, Formatter, Write},
str::FromStr,
};
use crate::unic_langid::{
subtags::{Language, Region},
LanguageIdentifier, LanguageIdentifierError,
};
#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
pub struct Key(pub Language, pub Option<Region>);
impl Display for Key {
#[inline]
fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), fmt::Error> {
f.write_str(self.0.as_str())?;
if let Some(region) = self.1 {
f.write_char('_')?;
f.write_str(region.as_str())?;
}
Ok(())
}
}
impl FromStr for Key {
type Err = LanguageIdentifierError;
#[inline]
fn from_str(s: &str) -> Result<Self, Self::Err> {
let langid = LanguageIdentifier::from_str(s)?;
let language = langid.language;
let region = langid.region;
Ok(Key(language, region))
}
}
#[macro_export]
macro_rules! key {
($key:expr) => {{
let langid = $crate::unic_langid::langid!($key);
$crate::Key(langid.language, langid.region)
}};
}