lib/mix/tasks/ca.new.da.ex

defmodule Mix.Tasks.Ca.New.Da do
  @moduledoc """
  Creates a new driven adapter for the clean architecture project
      $ mix ca.new.da --type driven_adapter_name

  Type param options:

  * secrestsmanager

  Examples:
      $ mix ca.new.da --type driven_adapter_name --name my_adapter
      $ mix ca.new.da --type secrestsmanager

  """

  alias ScaffoldCa.Core.ApplyDrivenAdapterTemplate
  alias ScaffoldCa.Utils.DataTypeUtils
  use Mix.Task

  @version Mix.Project.config()[:version]
  @switches [type: :string, name: :string]

  def run([]) do
    Mix.Tasks.Help.run(["ca.new.da"])
  end

  def run([version]) when version in ~w(-v --version) do
    Mix.shell().info([:reset, "Scaffold version ", :green, "v#{@version}"])
  end

  @shortdoc "Creates a new driven adapter"
  def run(args) do
    case Mix.Project.config() |> Keyword.fetch(:app) do
      :error ->
        Mix.shell().error("It is not a elixir project")

      {:ok, app_name} ->
       apply_template(app_name, args)
    end
  end

  defp apply_template(app_name, args) do

    case DataTypeUtils.parse_opts(args, @switches) do
          {opts, []} ->

            Mix.shell().info([:green, "* Creating driven adapter ", :reset, opts[:type]])
            ApplyDrivenAdapterTemplate.create_driven_adapter(
              to_string(app_name),
              opts[:name] || "valid_name",
              String.to_atom(opts[:type])
            )

            Mix.shell().info([:green, "* Driven Adapter created"])
          {_opts, [_ | _]} ->
            Mix.Tasks.Help.run(["ca.new.model"])
        end
  end

end