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