lib/extripe/actions/index.ex

defmodule Extripe.Actions.Index do
  alias Extripe.Utils.{API, Endpoint, Params}

  defmacro __using__(opts) do
    {scope, opts} = Keyword.pop(opts, :scope)
    resource = Keyword.fetch!(opts, :resource)

    code(scope, resource, Endpoint.scope_style(scope))
  end

  defp code(scope, resource, :no_scope_id) do
    path = quote do: Endpoint.build(unquote(scope), nil, unquote(resource))

    quote do
      @spec index() :: {:ok, map} | {:error, binary}
      def index do
        API.get(unquote(path))
      end
      @spec index(map) :: {:ok, map} | {:error, binary}
      def index(opts) do
        query_string = URI.encode_query(Params.normalize(opts))
        API.get(unquote(path) <> "?" <> query_string)
      end
    end
  end

  defp code(scope, resource, :with_scope_id) do
    path = quote do: Endpoint.build(unquote(scope), scope_id, unquote(resource))

    quote do
      @spec index(binary) :: {:ok, map} | {:error, binary}
      def index(scope_id) do
        API.get(unquote(path))
      end
      @spec index(binary, map) :: {:ok, map} | {:error, binary}
      def index(scope_id, opts) do
        query_string = URI.encode_query(Params.normalize(opts))
        API.get(unquote(path) <> "?" <> query_string)
      end
    end
  end
end