lib/api/search.ex

defmodule CensysEx.Search do
  @moduledoc """
  Search API V2 Specific wrapper around CensysEx.Paginate
  """

  alias CensysEx.Paginate

  @spec search(CensysEx.API.t(), String.t(), String.t(), integer(), Keyword.t()) :: CensysEx.result_stream(map())
  def search(client, index, query \\ "", per_page \\ 100, other_params \\ Keyword.new())

  def search(client, index, query, per_page, other_params)
      when index in ["hosts", "certificates"],
      do: Paginate.stream(client, gen_search_fn(index), &get_hits/1, [q: query, per_page: per_page] ++ other_params)

  def search(_, index, _, _, _), do: raise(CensysEx.Exception, message: "CensysEx: invalid index: #{index}")

  defp get_hits(%Paginate{} = client),
    do: get_in(client.results, ["result", "hits"])

  defp gen_search_fn(index),
    do: fn client, params -> CensysEx.API.get(client, index, "search", params) end
end