use clap::{Args, Parser, Subcommand};
const DEFAULT_BASE_URL: &str = "https://financialmodelingprep.com/stable/";
#[derive(Debug, Parser)]
#[command(version, about)]
pub struct Cli {
#[arg(long, env = "FMP_API_KEY", hide_env_values = true)]
pub api_key: Option<String>,
#[arg(long, env = "FMP_BASE_URL", default_value = DEFAULT_BASE_URL)]
pub base_url: String,
#[command(subcommand)]
pub command: Command,
}
#[derive(Debug, Subcommand)]
pub enum Command {
Search {
query: String,
},
#[command(subcommand)]
Company(CompanyCommand),
#[command(subcommand)]
Market(MarketCommand),
#[command(subcommand)]
Fundamentals(FundamentalsCommand),
#[command(subcommand)]
Analyst(AnalystCommand),
#[command(subcommand)]
Calendar(CalendarCommand),
#[command(subcommand)]
Rates(RatesCommand),
#[command(subcommand)]
Technical(TechnicalCommand),
#[command(subcommand)]
Filings(FilingsCommand),
News(NewsArgs),
#[command(hide = true)]
Profile(SymbolArgs),
#[command(hide = true)]
KeyExecutives(SymbolArgs),
#[command(hide = true)]
Quote(SymbolArgs),
#[command(hide = true)]
Historical(SymbolDateRangeArgs),
#[command(hide = true)]
DailyChart(SymbolDateRangeArgs),
#[command(hide = true)]
StockPeers(SymbolArgs),
#[command(hide = true)]
Dividends(SymbolArgs),
#[command(hide = true)]
Splits(SymbolArgs),
#[command(hide = true)]
EarningsCalendar(DateRangeArgs),
#[command(hide = true)]
TreasuryRates(DateRangeArgs),
#[command(hide = true)]
TechnicalSma(TechnicalSmaArgs),
#[command(hide = true)]
StockPriceChange(SymbolArgs),
#[command(hide = true)]
SecFilings(SymbolDateRangeArgs),
#[command(hide = true)]
IncomeStatement(AnnualArgs),
#[command(hide = true)]
IncomeStatementAsReported(AnnualArgs),
#[command(hide = true)]
BalanceSheet(AnnualArgs),
#[command(hide = true)]
CashFlow(AnnualArgs),
#[command(hide = true)]
Ratios(AnnualArgs),
#[command(hide = true)]
Metrics(AnnualArgs),
#[command(hide = true)]
CompanyStats(SymbolArgs),
#[command(hide = true)]
IncomeStatementGrowth(AnnualArgs),
#[command(hide = true)]
BalanceSheetGrowth(AnnualArgs),
#[command(hide = true)]
CashFlowGrowth(AnnualArgs),
#[command(hide = true)]
EnterpriseValues(AnnualArgs),
#[command(hide = true)]
FinancialScores(SymbolArgs),
#[command(hide = true)]
AnalystEstimates(AnnualArgs),
#[command(hide = true)]
StockNews(StockNewsArgs),
}
#[derive(Debug, Subcommand)]
pub enum CompanyCommand {
Profile(SymbolArgs),
Executives(SymbolArgs),
Peers(SymbolArgs),
Stats(SymbolArgs),
FinancialScores(SymbolArgs),
ShareFloat(SymbolArgs),
Rating(SymbolArgs),
}
#[derive(Debug, Subcommand)]
pub enum MarketCommand {
Quote(SymbolArgs),
Historical(SymbolDateRangeArgs),
DailyChart(SymbolDateRangeArgs),
Dividends(SymbolArgs),
Splits(SymbolArgs),
PriceChange(SymbolArgs),
}
#[derive(Debug, Subcommand)]
pub enum FundamentalsCommand {
IncomeStatement(AnnualArgs),
IncomeStatementAsReported(AnnualArgs),
BalanceSheet(AnnualArgs),
CashFlow(AnnualArgs),
Ratios(AnnualArgs),
Metrics(AnnualArgs),
IncomeStatementGrowth(AnnualArgs),
BalanceSheetGrowth(AnnualArgs),
CashFlowGrowth(AnnualArgs),
EnterpriseValues(AnnualArgs),
AnalystEstimates(AnnualArgs),
ReportDates(SymbolArgs),
}
#[derive(Debug, Subcommand)]
pub enum AnalystCommand {
PriceTargetConsensus(SymbolArgs),
PriceTargetSummary(SymbolArgs),
}
#[derive(Debug, Subcommand)]
pub enum CalendarCommand {
Earnings(DateRangeArgs),
}
#[derive(Debug, Subcommand)]
pub enum RatesCommand {
Treasury(DateRangeArgs),
}
#[derive(Debug, Subcommand)]
pub enum TechnicalCommand {
Sma(TechnicalSmaArgs),
}
#[derive(Debug, Subcommand)]
pub enum FilingsCommand {
Sec(SymbolDateRangeArgs),
}
#[derive(Debug, Subcommand)]
pub enum NewsCommand {
Stock(StockNewsArgs),
}
#[derive(Debug, Args)]
pub struct SymbolArgs {
pub symbol: String,
}
#[derive(Debug, Args)]
pub struct SymbolDateRangeArgs {
pub symbol: String,
#[arg(long)]
pub from: Option<String>,
#[arg(long)]
pub to: Option<String>,
}
#[derive(Debug, Args)]
pub struct DateRangeArgs {
#[arg(long)]
pub from: Option<String>,
#[arg(long)]
pub to: Option<String>,
}
#[derive(Debug, Args)]
pub struct AnnualArgs {
pub symbol: String,
#[arg(long)]
pub limit: Option<u16>,
}
#[derive(Debug, Args)]
pub struct TechnicalSmaArgs {
pub symbol: String,
#[arg(long, default_value_t = 10)]
pub period_length: u16,
#[arg(long, default_value = "1day")]
pub timeframe: String,
}
#[derive(Debug, Args)]
pub struct NewsArgs {
#[command(subcommand)]
pub command: Option<NewsCommand>,
#[arg(hide = true)]
pub symbol: Option<String>,
#[arg(long, hide = true)]
pub limit: Option<u16>,
}
#[derive(Debug, Args)]
pub struct StockNewsArgs {
pub symbol: String,
#[arg(long)]
pub limit: Option<u16>,
}