tact_client/
region.rs

1//! Region support for TACT protocol
2
3use std::fmt;
4
5/// Supported regions for TACT protocol
6#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
7pub enum Region {
8    /// United States
9    US,
10    /// Europe
11    EU,
12    /// Korea
13    KR,
14    /// China
15    CN,
16    /// Taiwan
17    TW,
18}
19
20impl Region {
21    /// Get all available regions
22    pub fn all() -> &'static [Region] {
23        &[Region::US, Region::EU, Region::KR, Region::CN, Region::TW]
24    }
25
26    /// Convert region to lowercase string representation
27    pub fn as_str(&self) -> &'static str {
28        match self {
29            Region::US => "us",
30            Region::EU => "eu",
31            Region::KR => "kr",
32            Region::CN => "cn",
33            Region::TW => "tw",
34        }
35    }
36
37    /// Parse region from string
38    pub fn parse(s: &str) -> Option<Self> {
39        match s.to_lowercase().as_str() {
40            "us" => Some(Region::US),
41            "eu" => Some(Region::EU),
42            "kr" => Some(Region::KR),
43            "cn" => Some(Region::CN),
44            "tw" => Some(Region::TW),
45            _ => None,
46        }
47    }
48}
49
50impl fmt::Display for Region {
51    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
52        write!(f, "{}", self.as_str())
53    }
54}
55
56impl std::str::FromStr for Region {
57    type Err = crate::Error;
58
59    fn from_str(s: &str) -> Result<Self, Self::Err> {
60        Region::parse(s).ok_or_else(|| crate::Error::InvalidRegion(s.to_string()))
61    }
62}
63
64#[cfg(test)]
65mod tests {
66    use super::*;
67
68    #[test]
69    fn test_region_parse() {
70        assert_eq!(Region::parse("us"), Some(Region::US));
71        assert_eq!(Region::parse("US"), Some(Region::US));
72        assert_eq!(Region::parse("eu"), Some(Region::EU));
73        assert_eq!(Region::parse("invalid"), None);
74    }
75
76    #[test]
77    fn test_region_from_str() {
78        use std::str::FromStr;
79
80        assert_eq!(Region::from_str("us").unwrap(), Region::US);
81        assert_eq!(Region::from_str("EU").unwrap(), Region::EU);
82        assert!(Region::from_str("invalid").is_err());
83    }
84
85    #[test]
86    fn test_region_display() {
87        assert_eq!(Region::US.to_string(), "us");
88        assert_eq!(Region::EU.to_string(), "eu");
89    }
90}