#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "kebab-case")]
pub enum Region {
#[serde(alias = "america", alias = "am")]
Americas,
#[serde(alias = "eu")]
Europe,
#[serde(alias = "asia", alias = "apac", alias = "asia_pacific")]
AsiaPacific,
#[serde(alias = "mea", alias = "emea", alias = "middle_east_africa")]
MiddleEastAfrica,
#[serde(alias = "currency", alias = "fx")]
Currencies,
}
impl std::str::FromStr for Region {
type Err = ();
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s.to_lowercase().replace(['-', '_'], "").as_str() {
"americas" | "america" | "am" => Ok(Region::Americas),
"europe" | "eu" => Ok(Region::Europe),
"asiapacific" | "asia" | "apac" => Ok(Region::AsiaPacific),
"middleeastafrica" | "mea" | "emea" => Ok(Region::MiddleEastAfrica),
"currencies" | "currency" | "fx" => Ok(Region::Currencies),
_ => Err(()),
}
}
}
impl Region {
pub fn parse(s: &str) -> Option<Self> {
s.parse().ok()
}
pub fn symbols(&self) -> &'static [&'static str] {
match self {
Region::Americas => AMERICAS,
Region::Europe => EUROPE,
Region::AsiaPacific => ASIA_PACIFIC,
Region::MiddleEastAfrica => MIDDLE_EAST_AFRICA,
Region::Currencies => CURRENCIES,
}
}
pub fn as_str(&self) -> &'static str {
match self {
Region::Americas => "americas",
Region::Europe => "europe",
Region::AsiaPacific => "asia-pacific",
Region::MiddleEastAfrica => "middle-east-africa",
Region::Currencies => "currencies",
}
}
pub fn all() -> &'static [Region] {
&[
Region::Americas,
Region::Europe,
Region::AsiaPacific,
Region::MiddleEastAfrica,
Region::Currencies,
]
}
}
pub const AMERICAS: &[&str] = &[
"^GSPC", "^DJI", "^IXIC", "^NYA", "^XAX", "^RUT", "^VIX", "^GSPTSE", "^BVSP", "^MXX", "^IPSA", "^MERV", ];
pub const EUROPE: &[&str] = &[
"^FTSE", "^GDAXI", "^FCHI", "^STOXX50E", "^N100", "^BFX", "^BUK100P", "MOEX.ME", "^125904-USD-STRD", ];
pub const ASIA_PACIFIC: &[&str] = &[
"^N225", "^HSI", "000001.SS", "^KS11", "^TWII", "^STI", "^AXJO", "^AORD", "^NZ50", "^BSESN", "^JKSE", "^KLSE", ];
pub const MIDDLE_EAST_AFRICA: &[&str] = &[
"^TA125.TA", "^CASE30", "^JN0U.JO", ];
pub const CURRENCIES: &[&str] = &[
"DX-Y.NYB", "^XDB", "^XDE", "^XDN", "^XDA", ];
pub fn all_symbols() -> Vec<&'static str> {
Region::all()
.iter()
.flat_map(|r| r.symbols().iter().copied())
.collect()
}