defmodule ExFinancialModelingPrep do @moduledoc """ Documentation for `ExFinancialModelingPrep`. """ alias ExFinancialModelingPrep.Api.{ StockFundamental, StockLookUpTool } @callback s_and_p_500_companies() :: {:ok | :error, any()} @callback income_statement(binary(), Keyword.t()) :: {:ok, IncomeStatement.t()} | {:error, any()} @callback financial_statement_list() :: {:ok | :error, any()} @callback balance_sheet_statement(binary(), Keyword.t()) :: {:ok | :error, any()} @callback cash_flow_statement(binary(), Keyword.t()) :: {:ok | :error, any()} @callback search(binary(), Keyword.t()) :: {:ok | :error, any()} def s_and_p_500_companies, do: impl(:market_indexes).s_and_p_500_companies() @doc delegate_to: {StockFundamental, :financial_statement_list, 0} def financial_statement_list, do: impl(:stock_fundamental).financial_statement_list() @doc delegate_to: {StockFundamental, :income_statement, 2} def income_statement(ticker, opts), do: impl(:stock_fundamental).income_statement(ticker, opts) @doc delegate_to: {StockFundamental, :balance_sheet_statement, 2} def balance_sheet_statement(ticker, opts \\ []), do: impl(:stock_fundamental).balance_sheet_statement(ticker, opts) @doc delegate_to: {StockFundamental, :cash_flow_statement, 2} def cash_flow_statement(ticker, opts \\ []), do: impl(:stock_fundamental).cash_flow_statement(ticker, opts) @doc delegate_to: {StockLookUpTool, :search, 2} def search(ticker_or_company, opts \\ []), do: impl(:stock_lookup_tool).search(ticker_or_company, opts) defp impl(module), do: Application.get_env(:ex_financial_modeling_prep, :impl)[module] end