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