#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "kebab-case")]
pub enum Screener {
AggressiveSmallCaps,
#[serde(alias = "gainers")]
DayGainers,
#[serde(alias = "losers")]
DayLosers,
#[serde(alias = "growth-tech")]
GrowthTechnologyStocks,
#[serde(alias = "actives")]
MostActives,
#[serde(alias = "most-shorted")]
MostShortedStocks,
SmallCapGainers,
#[serde(alias = "undervalued-growth")]
UndervaluedGrowthStocks,
#[serde(alias = "undervalued-large")]
UndervaluedLargeCaps,
ConservativeForeignFunds,
HighYieldBond,
PortfolioAnchors,
SolidLargeGrowthFunds,
SolidMidcapGrowthFunds,
TopMutualFunds,
}
impl Screener {
pub fn as_scr_id(&self) -> &'static str {
match self {
Screener::AggressiveSmallCaps => "aggressive_small_caps",
Screener::DayGainers => "day_gainers",
Screener::DayLosers => "day_losers",
Screener::GrowthTechnologyStocks => "growth_technology_stocks",
Screener::MostActives => "most_actives",
Screener::MostShortedStocks => "most_shorted_stocks",
Screener::SmallCapGainers => "small_cap_gainers",
Screener::UndervaluedGrowthStocks => "undervalued_growth_stocks",
Screener::UndervaluedLargeCaps => "undervalued_large_caps",
Screener::ConservativeForeignFunds => "conservative_foreign_funds",
Screener::HighYieldBond => "high_yield_bond",
Screener::PortfolioAnchors => "portfolio_anchors",
Screener::SolidLargeGrowthFunds => "solid_large_growth_funds",
Screener::SolidMidcapGrowthFunds => "solid_midcap_growth_funds",
Screener::TopMutualFunds => "top_mutual_funds",
}
}
pub fn parse(s: &str) -> Option<Self> {
s.parse().ok()
}
pub fn valid_types() -> &'static str {
"aggressive-small-caps, day-gainers, day-losers, growth-technology-stocks, \
most-actives, most-shorted-stocks, small-cap-gainers, undervalued-growth-stocks, \
undervalued-large-caps, conservative-foreign-funds, high-yield-bond, \
portfolio-anchors, solid-large-growth-funds, solid-midcap-growth-funds, \
top-mutual-funds"
}
pub fn all() -> &'static [Screener] {
&[
Screener::AggressiveSmallCaps,
Screener::DayGainers,
Screener::DayLosers,
Screener::GrowthTechnologyStocks,
Screener::MostActives,
Screener::MostShortedStocks,
Screener::SmallCapGainers,
Screener::UndervaluedGrowthStocks,
Screener::UndervaluedLargeCaps,
Screener::ConservativeForeignFunds,
Screener::HighYieldBond,
Screener::PortfolioAnchors,
Screener::SolidLargeGrowthFunds,
Screener::SolidMidcapGrowthFunds,
Screener::TopMutualFunds,
]
}
}
impl std::str::FromStr for Screener {
type Err = ();
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s.to_lowercase().replace('_', "-").as_str() {
"aggressive-small-caps" => Ok(Screener::AggressiveSmallCaps),
"day-gainers" | "gainers" => Ok(Screener::DayGainers),
"day-losers" | "losers" => Ok(Screener::DayLosers),
"growth-technology-stocks" | "growth-tech" => Ok(Screener::GrowthTechnologyStocks),
"most-actives" | "actives" => Ok(Screener::MostActives),
"most-shorted-stocks" | "most-shorted" => Ok(Screener::MostShortedStocks),
"small-cap-gainers" => Ok(Screener::SmallCapGainers),
"undervalued-growth-stocks" | "undervalued-growth" => {
Ok(Screener::UndervaluedGrowthStocks)
}
"undervalued-large-caps" | "undervalued-large" => Ok(Screener::UndervaluedLargeCaps),
"conservative-foreign-funds" => Ok(Screener::ConservativeForeignFunds),
"high-yield-bond" => Ok(Screener::HighYieldBond),
"portfolio-anchors" => Ok(Screener::PortfolioAnchors),
"solid-large-growth-funds" => Ok(Screener::SolidLargeGrowthFunds),
"solid-midcap-growth-funds" => Ok(Screener::SolidMidcapGrowthFunds),
"top-mutual-funds" => Ok(Screener::TopMutualFunds),
_ => Err(()),
}
}
}