lib/mix/tasks/couchx.gen.mango_index.ex

defmodule Mix.Tasks.Couchx.Gen.MangoIndex do
  use Mix.Task
  import Macro, only: [camelize: 1]
  import Mix.Generator
  import Mix.Ecto
  import Couchx.Support.ApplicationHelper

  @cwd File.cwd!

  @impl true
  def run(args) do
    Mix.Task.run("app.config")

    [repo] = parse_repo(args)
    index_name = parse_index_name(args)

    assigns= [
      repo_name: repo_name(repo),
      index_name: index_name,
      index_module: index_module(index_name),
      fields: parsed_fields(args)
    ]

    copy_template(
      template_file_path(),
      migrations_path(repo, index_name),
      assigns
    )
  end

  defp repo_name(repo) do
    repo
    |> to_string
    |> String.replace("Elixir.", "")
  end

  defp index_module(name) do
    name
    |> String.replace("-", "_")
    |> camelize
  end

  defp migrations_path(repo, filename) do
    repo
    |> base_repo_path("index")
    |> Path.join("#{filename}.exs")
  end

  defp template_file_path do
    "#{@cwd}/lib/templates/mango_index.exs.eex"
  end

  defp parse_index_name(["-n"|t]) do
    List.first(t)
  end

  defp parse_index_name(["--name"|t]) do
    List.first(t)
  end

  defp parse_index_name([_|t]) do
    parse_index_name(t)
  end

  defp parse_index_name([]) do
    raise "Missing Index Name"
  end

  defp parsed_fields(["-f"|t]) do
    fields_to_sigil(t)
  end

  defp parsed_fields(["--fields"|t]) do
    fields_to_sigil(t)
  end

  defp parsed_fields([_|t]) do
    parsed_fields(t)
  end

  defp parsed_fields([]), do: "[]"

  defp fields_to_sigil(fields) do
    "~#{split_fields(List.first(fields))}"
  end

  defp split_fields(fields) do
    fields
    |> String.replace(",", " ")
  end
end