lib/mix/tasks/dripdrop.gen.migration.ex

defmodule Mix.Tasks.Dripdrop.Gen.Migration do
  @moduledoc """
  Generates a host migration that applies pending DripDrop schema upgrades.

  Migration files are vendored under `priv/dripdrop/sql/versions/`. The
  generated host migration calls `DripDrop.Migration.up/0`, which applies any
  vendored SQL versions newer than the database's recorded
  `dripdrop.dripdrop_version`.
  """

  @shortdoc "Generates an Ecto wrapper migration for DripDrop upgrades"

  use Mix.Task

  alias DripDrop.MixHelpers

  @impl Mix.Task
  def run(args) do
    {opts, _args, _invalid} = OptionParser.parse(args, switches: [repo: :string])

    repo = MixHelpers.resolve_repo(opts[:repo])
    migrations_dir = MixHelpers.migrations_dir(repo)
    File.mkdir_p!(migrations_dir)

    path = Path.join(migrations_dir, "#{MixHelpers.timestamp()}_upgrade_dripdrop.exs")
    File.write!(path, migration_content(repo))

    Mix.shell().info("Created migration: #{path}")
  end

  defp migration_content(repo) do
    """
    defmodule #{inspect(repo)}.Migrations.UpgradeDripdrop do
      @moduledoc \"\"\"
      Applies pending DripDrop library migrations.

      Generated by: `mix dripdrop.gen.migration`

      DripDrop migrations are vendored as versioned SQL under
      `priv/dripdrop/sql/versions`. `DripDrop.Migration.up/0` applies any
      version newer than the database's current `dripdrop.dripdrop_version`.
      \"\"\"
      use Ecto.Migration

      def up do
        DripDrop.Migration.up()
      end

      def down do
        DripDrop.Migration.down()
      end
    end
    """
  end
end