use clap::Subcommand;
use crate::cli::args::{PagedArgs, SymbolArgs, SymbolLimitArgs};
use crate::cli::dispatch::{run_by_symbol, run_by_symbol_limit, run_paged, unavailable_endpoint};
use crate::cli::help;
use crate::cli::output::CommandPayload;
use crate::client::FmpClient;
use crate::error::Result;
#[derive(Debug, Subcommand)]
pub(crate) enum Cmd {
#[command(
about = help::COMPANY_PROFILE_ABOUT,
long_about = help::COMPANY_PROFILE_LONG
)]
Profile(SymbolArgs),
#[command(
about = help::COMPANY_EXECUTIVES_ABOUT,
long_about = help::COMPANY_EXECUTIVES_LONG
)]
Executives(SymbolArgs),
#[command(
about = help::COMPANY_PEERS_ABOUT,
long_about = help::COMPANY_PEERS_LONG
)]
Peers(SymbolArgs),
#[command(
about = help::COMPANY_FINANCIAL_SCORES_ABOUT,
long_about = help::COMPANY_FINANCIAL_SCORES_LONG
)]
Scores(SymbolArgs),
#[command(
about = help::COMPANY_SHARE_FLOAT_ABOUT,
long_about = help::COMPANY_SHARE_FLOAT_LONG
)]
Float(SymbolArgs),
#[command(
about = help::COMPANY_RATING_ABOUT,
long_about = help::COMPANY_RATING_LONG
)]
Rating(SymbolArgs),
#[command(
about = help::COMPANY_HISTORICAL_RATING_ABOUT,
long_about = help::COMPANY_HISTORICAL_RATING_LONG
)]
HistoricalRating(SymbolLimitArgs),
#[command(
about = help::COMPANY_OUTLOOK_ABOUT,
long_about = help::COMPANY_OUTLOOK_LONG
)]
Outlook(SymbolArgs),
#[command(
about = help::COMPANY_DELISTED_ABOUT,
long_about = help::COMPANY_DELISTED_LONG
)]
Delisted(PagedArgs),
}
pub(crate) async fn dispatch(client: &FmpClient, cmd: &Cmd) -> Result<CommandPayload> {
match cmd {
Cmd::Profile(args) => run_by_symbol(client, crate::endpoint::PROFILE, &args.symbol).await,
Cmd::Executives(args) => {
run_by_symbol(client, crate::endpoint::KEY_EXECUTIVES, &args.symbol).await
}
Cmd::Peers(args) => run_by_symbol(client, crate::endpoint::STOCK_PEERS, &args.symbol).await,
Cmd::Scores(args) => {
run_by_symbol(client, crate::endpoint::FINANCIAL_SCORES, &args.symbol).await
}
Cmd::Float(args) => {
run_by_symbol(client, crate::endpoint::SHARES_FLOAT, &args.symbol).await
}
Cmd::Rating(args) => {
run_by_symbol(client, crate::endpoint::GRADES_CONSENSUS, &args.symbol).await
}
Cmd::HistoricalRating(args) => {
run_by_symbol_limit(
client,
crate::endpoint::RATINGS_HISTORICAL,
&args.symbol,
args.limit,
)
.await
}
Cmd::Outlook(_) => unavailable_endpoint(
crate::endpoint::COMPANY_OUTLOOK.path(),
"FMP only documents company outlook as a legacy endpoint; no stable API path is available for this command",
),
Cmd::Delisted(args) => {
run_paged(
client,
crate::endpoint::DELISTED_COMPANIES,
args.page,
args.limit,
)
.await
}
}
}