lib/api/stock_lookup_tool.ex

defmodule ExFinancialModelingPrep.Api.StockLookUpTool do
  @moduledoc """
  [Stock Look Up Tool API](https://site.financialmodelingprep.com/developer/docs/#Stock-News)
  """
  alias ExFinancialModelingPrep.Api.Client
  alias ExFinancialModelingPrep.Struct.Search

  @doc """
    Search via ticker and company name. Values for exchange options are:
      ETF | MUTUAL_FUND | COMMODITY | INDEX | CRYPTO | FOREX | TSX | AMEX | NASDAQ | NYSE | EURONEXT | XETRA | NSE | LSE
  """
  @spec search(String.t(), exchange: String.t()) ::
          {:ok, [Search.t()]} | {:error, HTTPoison.Error.t()}
  def search(ticker_or_company, opts) do
    query =
      %{"query" => ticker_or_company}
      |> Map.merge(Enum.into(opts, %{}))
      |> URI.encode_query()

    %URI{path: "/v3/search", query: query}
    |> URI.to_string()
    |> Client.get()
    |> case do
      {:ok, %{status_code: 200, body: companies}} ->
        Enum.map(companies, fn company ->
          %Search{
            currency: company["currency"],
            exchange_short_name: company["exchangeShortName"],
            name: company["name"],
            stock_exchange: company["stockExchange"],
            symbol: company["symbol"]
          }
        end)

      {:error, error} ->
        {:error, error}
    end
  end
end