lib/mix/tasks/do_it.config.init.ex

defmodule Mix.Tasks.DoIt.Config.Init do
  use Mix.Task

  import Mix.Generator

  @shortdoc "Initializes DoIt persistent configuration"

  @moduledoc """
  Initializes DoIt persistent configuration.

  ## Examples

      $ mix do_it.config.init
  """

  embed_template(:config, """
  config :do_it, DoIt.Commfig,
    dirname: System.tmp_dir(),
    filename: "<%= @app %>.json"
  """)

  @impl true
  def run(_args) do
    config = Mix.Project.config()
    config_first_line = "import Config"
    config_path = config[:config_path] || "config/config.exs"
    app = config[:app] || :YOUR_APP_NAME
    opts = [app: app]

    case File.read(config_path) do
      {:ok, contents} ->
        new_contents = config_first_line <> "\n\n" <> config_template(opts)
        Mix.shell().info([:green, "* updating ", :reset, config_path])
        File.write!(config_path, String.replace(contents, config_first_line, new_contents))

      {:error, _} ->
        create_file(config_path, "import Config\n\n" <> config_template(opts))
    end
  end
end