1use std::fmt;
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
7pub enum Region {
8 US,
10 EU,
12 KR,
14 CN,
16 TW,
18}
19
20impl Region {
21 pub fn all() -> &'static [Region] {
23 &[Region::US, Region::EU, Region::KR, Region::CN, Region::TW]
24 }
25
26 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 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}