lib/indices/list.ex

defmodule ExDeltaExchange.Indices.List do
  @type market :: ExDeltaExchange.Index.t()
  @type result :: {:ok, [market]} | {:error, :parse_result_item}

  @spec get() :: result
  def get do
    "/indices"
    |> ExDeltaExchange.HTTPClient.get(%{})
    |> parse_response()
  end

  defp parse_response({:ok, %ExDeltaExchange.JsonResponse{success: true, result: assets}}) do
    assets
    |> Enum.map(&Mapail.map_to_struct(&1, ExDeltaExchange.Index, transformations: [:snake_case]))
    |> Enum.reduce(
      {:ok, []},
      fn
        {:ok, i}, {:ok, acc} -> {:ok, [i | acc]}
        _, _acc -> {:error, :parse_result_item}
      end
    )
  end

  defp parse_response({:ok, %ExDeltaExchange.JsonResponse{success: false, error: error}}) do
    {:error, error}
  end
end