lib/mix/tasks/cf_sync.setup.ex

defmodule Mix.Tasks.CfSync.Setup do
  @moduledoc """
  This task builds config files for use with `mix cf_sync.dump`.
  """
  @shortdoc "Setup configuration for `mix cf_sync.dump`."

  use Mix.Task

  import CfSync.Tasks.Utils

  @default_url "https://cdn.contentful.com/"

  @impl Mix.Task
  def run(_) do
    name =
      ask("Config name: (default) ",
        filter: ~r/^[a-z_]+$/,
        error_message: "Lowercase and underscore only, please.",
        default_value: "default"
      )

    next =
      case read_conf(name) do
        :no_file ->
          :setup

        {:ok, data} ->
          warn("Current config data for \"#{name}\":")
          IO.puts("########## START CONFIG ##########")
          IO.puts(inspect(data, pretty: true, width: 0))
          IO.puts("########### END CONFIG ###########")

          overwrite =
            ask("Do you want to overwrite this config file? ",
              default_value: "n"
            )

          if String.downcase(overwrite) == "y" do
            :setup
          else
            :end
          end
      end

    if next == :setup, do: setup(name)
  end

  defp setup(name) do
    root_url =
      ask(
        "Content delivery API root: (#{@default_url}) ",
        filter:
          ~r/^https?:\/\/(?:www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b(?:[-a-zA-Z0-9()@:%_\+.~#?&\/=]*)$/,
        default_value: @default_url,
        error_msg: "URL format, please."
      )

    space_id = ask("Contentful space ID: ", filter: ~r/^.+$/)
    delivery_token = ask("Token for Content delivery API: ", filter: ~r/^.+$/)

    write_conf!(name, %{
      root_url: root_url,
      space_id: space_id,
      delivery_token: delivery_token
    })
  end
end