lib/util.ex

defmodule MixErlangTasks.Util do
  def filter_opts(opts) do
    Enum.reduce(opts, [], fn
      {name, nil}, acc -> [name | acc]
      {name, val}, acc -> [name, val | acc]
    end)
  end

  def compile_files(files, dir) do
    File.mkdir_p!(dir)

    status =
      Enum.reduce(files, :ok, fn path, status ->
        case :compile.file(
               String.to_charlist(path),
               [{:outdir, String.to_charlist(dir)}, :report]
             ) do
          {:ok, _} ->
            IO.puts("Compiled #{path}")
            status

          :error ->
            :error
        end
      end)

    if status == :error, do: Mix.raise("Encountered compilation errors")

    Code.prepend_path(dir)
  end
end