use core::{fmt::Display, str::FromStr};
use rfham_core::error::CoreError;
use serde_with::{DeserializeFromStr, SerializeDisplay};
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, DeserializeFromStr, SerializeDisplay)]
#[repr(u32)]
pub enum Region {
One = 1,
Two = 2,
Three = 3,
}
impl Display for Region {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"{}",
match (self, f.alternate()) {
(Region::One, true) => "IARU/ITU Region 1",
(Region::One, false) => "1",
(Region::Two, true) => "IARU/ITU Region 2",
(Region::Two, false) => "2",
(Region::Three, true) => "IARU/ITU Region 3",
(Region::Three, false) => "3",
}
)
}
}
impl FromStr for Region {
type Err = CoreError;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"1" | "one" => Ok(Self::One),
"2" | "two" => Ok(Self::Two),
"3" | "three" => Ok(Self::Three),
_ => Err(CoreError::InvalidValueFromStr(s.to_string(), "Region")),
}
}
}
#[cfg(test)]
mod tests {
use super::Region;
use pretty_assertions::assert_eq;
use std::str::FromStr;
#[test]
fn test_display_numeral() {
assert_eq!("1", Region::One.to_string());
assert_eq!("3", Region::Three.to_string());
}
#[test]
fn test_display_alternate() {
assert_eq!("IARU/ITU Region 2", format!("{:#}", Region::Two));
}
#[test]
fn test_from_str_numeric() {
assert_eq!(Region::One, "1".parse().unwrap());
assert_eq!(Region::Two, "2".parse().unwrap());
assert_eq!(Region::Three, "3".parse().unwrap());
}
#[test]
fn test_from_str_word() {
assert_eq!(Region::One, Region::from_str("one").unwrap());
assert_eq!(Region::Two, Region::from_str("two").unwrap());
assert_eq!(Region::Three, Region::from_str("three").unwrap());
}
#[test]
fn test_from_str_invalid() {
assert!("4".parse::<Region>().is_err());
assert!("zero".parse::<Region>().is_err());
}
}