lib/couchx/mango_index.ex

defmodule Couchx.MangoIndex do
  defmacro __using__(repo_name: repo_name) do
    quote location: :keep do
      @repo_name unquote(repo_name)
      @default_type %{type: "json"}

      import Couchx.MangoIndex

      def create_index(name, do: block) do
        block
        |> build_index
        |> add_type
        |> Map.merge(%{name: name, ddoc: name})
        |> persist_index
      end

      def drop_index(name) do
        delete_index(name)
      end

      def drop_index(name, id) do
        delete_index(name, id)
      end

      defp add_type(%{type: _type} = doc), do: doc
      defp add_type(doc), do: Map.merge(doc, @default_type)

      defp build_index(index), do: %{index: index}

      defp persist_index(doc) do
        {adapter, meta} = Ecto.Repo.Registry.lookup(@repo_name)
        Couchx.DbConnection.index(meta[:pid], doc)
        |> handle_response
      end

      defp delete_index(name, id \\ nil) do
        {adapter, meta} = Ecto.Repo.Registry.lookup(@repo_name)
        Couchx.DbConnection.delete(meta[:pid], :index, name, id)
        |> handle_response
      end


      defp handle_response({:ok, response}), do: response
      defp handle_response({_, response}), do: {:error, response}
    end
  end
end