lib/phil_columns/seed.ex

defmodule PhilColumns.Seed do
  defmacro __using__(_opts) do
    quote location: :keep do
      import PhilColumns.Seed
      @disable_ddl_transaction false
      Module.register_attribute(__MODULE__, :envs, accumulate: true)
      Module.register_attribute(__MODULE__, :tags, accumulate: true)
      @before_compile PhilColumns.Seed

      def down(repo) do
      end

      def up(repo) do
      end

      defoverridable down: 1,
                     up: 1
    end
  end

  @doc false
  defmacro __before_compile__(env) do
    envs = Module.get_attribute(env.module, :envs)
    tags = Module.get_attribute(env.module, :tags)

    if envs == [] do
      raise "no envs have been defined in #{inspect(env.module)}"
    end

    quote do
      def __seed__,
        do: [disable_ddl_transaction: @disable_ddl_transaction]

      def envs, do: unquote(List.flatten(envs) |> Enum.dedup() |> Enum.sort())

      def tags, do: unquote(List.flatten(tags) |> Enum.dedup() |> Enum.sort())
    end
  end

  defmacro env(env) do
    quote do
      @envs unquote(env)
    end
  end

  defmacro envs(envs) do
    quote do
      @envs unquote(envs)
    end
  end

  defmacro tag(tag) do
    quote do
      @tags unquote(tag)
    end
  end

  defmacro tags(tags) do
    quote do
      @tags unquote(tags)
    end
  end
end