fmp-rs 0.1.1

Production-grade Rust client for Financial Modeling Prep API with intelligent caching, rate limiting, and comprehensive endpoint coverage
Documentation
//! Financial statement models.

use serde::{Deserialize, Serialize};

/// Income statement
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct IncomeStatement {
    pub date: String,
    pub symbol: String,
    pub reported_currency: String,
    pub cik: String,
    pub filling_date: String,
    pub accepted_date: String,
    pub calendar_year: String,
    pub period: String,
    pub revenue: i64,
    pub cost_of_revenue: i64,
    pub gross_profit: i64,
    pub gross_profit_ratio: f64,
    pub research_and_development_expenses: i64,
    pub general_and_administrative_expenses: i64,
    pub selling_and_marketing_expenses: i64,
    pub selling_general_and_administrative_expenses: i64,
    pub other_expenses: i64,
    pub operating_expenses: i64,
    pub cost_and_expenses: i64,
    pub interest_income: i64,
    pub interest_expense: i64,
    pub depreciation_and_amortization: i64,
    pub ebitda: i64,
    pub ebitda_ratio: f64,
    pub operating_income: i64,
    pub operating_income_ratio: f64,
    pub total_other_income_expenses_net: i64,
    pub income_before_tax: i64,
    pub income_before_tax_ratio: f64,
    pub income_tax_expense: i64,
    pub net_income: i64,
    pub net_income_ratio: f64,
    pub eps: f64,
    pub eps_diluted: f64,
    pub weighted_average_shs_out: i64,
    pub weighted_average_shs_out_dil: i64,
    pub link: String,
    pub final_link: String,
}

/// Balance sheet statement
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct BalanceSheet {
    pub date: String,
    pub symbol: String,
    pub reported_currency: String,
    pub cik: String,
    pub filling_date: String,
    pub accepted_date: String,
    pub calendar_year: String,
    pub period: String,
    pub cash_and_cash_equivalents: i64,
    pub short_term_investments: i64,
    pub cash_and_short_term_investments: i64,
    pub net_receivables: i64,
    pub inventory: i64,
    pub other_current_assets: i64,
    pub total_current_assets: i64,
    pub property_plant_equipment_net: i64,
    pub goodwill: i64,
    pub intangible_assets: i64,
    pub goodwill_and_intangible_assets: i64,
    pub long_term_investments: i64,
    pub tax_assets: i64,
    pub other_non_current_assets: i64,
    pub total_non_current_assets: i64,
    pub other_assets: i64,
    pub total_assets: i64,
    pub account_payables: i64,
    pub short_term_debt: i64,
    pub tax_payables: i64,
    pub deferred_revenue: i64,
    pub other_current_liabilities: i64,
    pub total_current_liabilities: i64,
    pub long_term_debt: i64,
    pub deferred_revenue_non_current: i64,
    pub deferred_tax_liabilities_non_current: i64,
    pub other_non_current_liabilities: i64,
    pub total_non_current_liabilities: i64,
    pub other_liabilities: i64,
    pub capital_lease_obligations: i64,
    pub total_liabilities: i64,
    pub preferred_stock: i64,
    pub common_stock: i64,
    pub retained_earnings: i64,
    pub accumulated_other_comprehensive_income_loss: i64,
    pub othertotal_stockholders_equity: i64,
    pub total_stockholders_equity: i64,
    pub total_equity: i64,
    pub total_liabilities_and_stockholders_equity: i64,
    pub minority_interest: i64,
    pub total_liabilities_and_total_equity: i64,
    pub total_investments: i64,
    pub total_debt: i64,
    pub net_debt: i64,
    pub link: String,
    pub final_link: String,
}

/// Cash flow statement
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct CashFlowStatement {
    pub date: String,
    pub symbol: String,
    pub reported_currency: String,
    pub cik: String,
    pub filling_date: String,
    pub accepted_date: String,
    pub calendar_year: String,
    pub period: String,
    pub net_income: i64,
    pub depreciation_and_amortization: i64,
    pub deferred_income_tax: i64,
    pub stock_based_compensation: i64,
    pub change_in_working_capital: i64,
    pub accounts_receivables: i64,
    pub inventory: i64,
    pub accounts_payables: i64,
    pub other_working_capital: i64,
    pub other_non_cash_items: i64,
    pub net_cash_provided_by_operating_activities: i64,
    pub investments_in_property_plant_and_equipment: i64,
    pub acquisitions_net: i64,
    pub purchases_of_investments: i64,
    pub sales_maturities_of_investments: i64,
    pub other_investing_activites: i64,
    pub net_cash_used_for_investing_activites: i64,
    pub debt_repayment: i64,
    pub common_stock_issued: i64,
    pub common_stock_repurchased: i64,
    pub dividends_paid: i64,
    pub other_financing_activites: i64,
    pub net_cash_used_provided_by_financing_activities: i64,
    pub effect_of_forex_changes_on_cash: i64,
    pub net_change_in_cash: i64,
    pub cash_at_end_of_period: i64,
    pub cash_at_beginning_of_period: i64,
    pub operating_cash_flow: i64,
    pub capital_expenditure: i64,
    pub free_cash_flow: i64,
    pub link: String,
    pub final_link: String,
}

/// Financial ratios
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct FinancialRatios {
    pub symbol: String,
    pub date: String,
    pub calendar_year: String,
    pub period: String,
    pub current_ratio: f64,
    pub quick_ratio: f64,
    pub cash_ratio: f64,
    pub days_of_sales_outstanding: f64,
    pub days_of_inventory_outstanding: f64,
    pub operating_cycle: f64,
    pub days_of_payables_outstanding: f64,
    pub cash_conversion_cycle: f64,
    pub gross_profit_margin: f64,
    pub operating_profit_margin: f64,
    pub pretax_profit_margin: f64,
    pub net_profit_margin: f64,
    pub effective_tax_rate: f64,
    pub return_on_assets: f64,
    pub return_on_equity: f64,
    pub return_on_capital_employed: f64,
    pub net_income_per_ebt: f64,
    pub ebt_per_ebit: f64,
    pub ebit_per_revenue: f64,
    pub debt_ratio: f64,
    pub debt_equity_ratio: f64,
    pub long_term_debt_to_capitalization: f64,
    pub total_debt_to_capitalization: f64,
    pub interest_coverage: f64,
    pub cash_flow_to_debt_ratio: f64,
    pub company_equity_multiplier: f64,
    pub receivables_turnover: f64,
    pub payables_turnover: f64,
    pub inventory_turnover: f64,
    pub fixed_asset_turnover: f64,
    pub asset_turnover: f64,
    pub operating_cash_flow_per_share: f64,
    pub free_cash_flow_per_share: f64,
    pub cash_per_share: f64,
    pub payout_ratio: f64,
    pub operating_cash_flow_sales_ratio: f64,
    pub free_cash_flow_operating_cash_flow_ratio: f64,
    pub cash_flow_coverage_ratios: f64,
    pub short_term_coverage_ratios: f64,
    pub capital_expenditure_coverage_ratio: f64,
    pub dividend_paid_and_capex_coverage_ratio: f64,
    pub dividend_payout_ratio: f64,
    pub price_book_value_ratio: f64,
    pub price_to_book_ratio: f64,
    pub price_to_sales_ratio: f64,
    pub price_earnings_ratio: f64,
    pub price_to_free_cash_flows_ratio: f64,
    pub price_to_operating_cash_flows_ratio: f64,
    pub price_cash_flow_ratio: f64,
    pub price_earnings_to_growth_ratio: f64,
    pub price_sales_ratio: f64,
    pub dividend_yield: f64,
    pub enterprise_value_multiple: f64,
    pub price_fair_value: f64,
}

/// Key metrics
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct KeyMetrics {
    pub symbol: String,
    pub date: String,
    pub calendar_year: String,
    pub period: String,
    pub revenue_per_share: f64,
    pub net_income_per_share: f64,
    pub operating_cash_flow_per_share: f64,
    pub free_cash_flow_per_share: f64,
    pub cash_per_share: f64,
    pub book_value_per_share: f64,
    pub tangible_book_value_per_share: f64,
    pub shareholders_equity_per_share: f64,
    pub interest_debt_per_share: f64,
    pub market_cap: i64,
    pub enterprise_value: i64,
    pub pe_ratio: f64,
    pub price_to_sales_ratio: f64,
    pub pocf_ratio: f64,
    pub pfcf_ratio: f64,
    pub pb_ratio: f64,
    pub ptb_ratio: f64,
    pub ev_to_sales: f64,
    pub enterprise_value_over_ebitda: f64,
    pub ev_to_operating_cash_flow: f64,
    pub ev_to_free_cash_flow: f64,
    pub earnings_yield: f64,
    pub free_cash_flow_yield: f64,
    pub debt_to_equity: f64,
    pub debt_to_assets: f64,
    pub net_debt_to_ebitda: f64,
    pub current_ratio: f64,
    pub interest_coverage: f64,
    pub income_quality: f64,
    pub dividend_yield: f64,
    pub payout_ratio: f64,
    pub sales_general_and_administrative_to_revenue: f64,
    pub research_and_ddevelopement_to_revenue: f64,
    pub intangibles_to_total_assets: f64,
    pub capex_to_operating_cash_flow: f64,
    pub capex_to_revenue: f64,
    pub capex_to_depreciation: f64,
    pub stock_based_compensation_to_revenue: f64,
    pub graham_number: f64,
    pub roic: f64,
    pub return_on_tangible_assets: f64,
    pub graham_net_net: f64,
    pub working_capital: i64,
    pub tangible_asset_value: i64,
    pub net_current_asset_value: i64,
    pub invested_capital: i64,
    pub average_receivables: i64,
    pub average_payables: i64,
    pub average_inventory: i64,
    pub days_sales_outstanding: f64,
    pub days_payables_outstanding: f64,
    pub days_of_inventory_on_hand: f64,
    pub receivables_turnover: f64,
    pub payables_turnover: f64,
    pub inventory_turnover: f64,
    pub roe: f64,
    pub capex_per_share: f64,
}

/// Financial growth metrics
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct FinancialGrowth {
    pub date: String,
    pub symbol: String,
    pub period: String,
    pub calendar_year: String,
    pub revenue_growth: f64,
    pub gross_profit_growth: f64,
    pub ebit_growth: f64,
    pub operating_income_growth: f64,
    pub net_income_growth: f64,
    pub eps_growth: f64,
    pub eps_diluted_growth: f64,
    pub weighted_average_shares_growth: f64,
    pub weighted_average_shares_diluted_growth: f64,
    pub dividends_per_share_growth: f64,
    pub operating_cash_flow_growth: f64,
    pub free_cash_flow_growth: f64,
    pub ten_y_revenue_growth_per_share: f64,
    pub five_y_revenue_growth_per_share: f64,
    pub three_y_revenue_growth_per_share: f64,
    pub ten_y_operating_cf_growth_per_share: f64,
    pub five_y_operating_cf_growth_per_share: f64,
    pub three_y_operating_cf_growth_per_share: f64,
    pub ten_y_net_income_growth_per_share: f64,
    pub five_y_net_income_growth_per_share: f64,
    pub three_y_net_income_growth_per_share: f64,
    pub ten_y_shareholders_equity_growth_per_share: f64,
    pub five_y_shareholders_equity_growth_per_share: f64,
    pub three_y_shareholders_equity_growth_per_share: f64,
    pub ten_y_dividend_per_share_growth_per_share: f64,
    pub five_y_dividend_per_share_growth_per_share: f64,
    pub three_y_dividend_per_share_growth_per_share: f64,
    pub receivables_growth: f64,
    pub inventory_growth: f64,
    pub asset_growth: f64,
    pub book_value_per_share_growth: f64,
    pub debt_growth: f64,
    pub rd_expense_growth: f64,
    pub sg_a_expenses_growth: f64,
}

/// Financial statement as reported (XBRL data)
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct FinancialAsReported {
    pub date: String,
    pub symbol: String,
    pub period: String,
    pub cik: String,
    pub filling_date: String,
    pub accepted_date: String,
    pub calendar_year: String,
    // XBRL data is dynamic, so we use a generic value
    #[serde(flatten)]
    pub data: serde_json::Map<String, serde_json::Value>,
}

/// Revenue product segmentation
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct RevenueProductSegmentation {
    pub date: String,
    pub symbol: String,
    #[serde(flatten)]
    pub segments: serde_json::Map<String, serde_json::Value>,
}

/// Revenue geographic segmentation
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct RevenueGeographicSegmentation {
    pub date: String,
    pub symbol: String,
    #[serde(flatten)]
    pub segments: serde_json::Map<String, serde_json::Value>,
}