lib/mix/tasks/nimble_template.upgrade_stack.ex

defmodule Mix.Tasks.NimbleTemplate.UpgradeStack do
  @shortdoc "Upgrade Elixir, Erlang, Alpine or Node version."

  @moduledoc """
  #{@shortdoc}

  - Hex package: https://hex.pm/packages/nimble_template
  - Github: https://github.com/nimblehq/elixir-templates

  # Usage

  - mix help nimble_template.upgrade_stack # Print help
  - mix nimble_template.upgrade_stack elixir x.x.x # Upgrade Elixir to x.x.x
  - mix nimble_template.upgrade_stack erlang x.x.x # Upgrade Erlang to x.x.x
  - mix nimble_template.upgrade_stack alpine x.x.x # Upgrade Alpine to x.x.x
  - mix nimble_template.upgrade_stack node x.x.x # Upgrade Node to x.x.x
  - mix nimble_template.upgrade_stack elixir x.x.x erlang y.y.y alpine z.z.z node w.w.w # Upgrade Elixir, Erlang, Alpine and Node
  """

  use Mix.Task

  alias NimbleTemplate.Version

  def run(args) do
    stack_versions = parse_opts(args)

    Version.upgrade_stack(stack_versions)
  end

  defp parse_opts(args) do
    case OptionParser.parse(args,
           strict: [
             elixir: :string,
             erlang: :string,
             alpine: :string,
             node: :string
           ]
         ) do
      {stack_versions, _args, _invalid} ->
        stack_versions

      _other ->
        Mix.raise(
          "Invalid command. Check `mix help nimble_template.upgrade_stack` for more information."
        )
    end
  end
end