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

defmodule Mix.Tasks.Baz.Gen.Migration do
  @shortdoc "Generates migrations for baz"

  @moduledoc """
  Generates the required database migrations for baz.
  """
  use Mix.Task

  import Mix.Ecto
  import Mix.Generator

  @migrations_path "priv/templates/migrations"

  @doc false
  def run(args) do
    no_umbrella!("ecto.gen.migration")

    repos = parse_repo(args)

    Enum.each(repos, fn repo ->
      ensure_repo(repo, args)
      path = Ecto.Migrator.migrations_path(repo)
      app_dir = Application.app_dir(:baz)
      app_migrations_path = Path.join(app_dir, @migrations_path)
      {:ok, migrations} = app_migrations_path |> File.ls()
      source_paths = Enum.map(migrations, &Path.join(app_migrations_path, &1))
      app_module = get_app_module()

      generated_files =
        source_paths
        |> Enum.map(fn source_path ->
          EEx.eval_file(source_path,
            module_prefix: app_module,
            migration_prefix: Baz.Migrations.migration_prefix(),
            oban_table_prefix: Baz.Migrations.oban_table_prefix()
          )
        end)

      target_files =
        source_paths
        |> Enum.map(fn source_path ->
          basename = Path.basename(source_path, ".eex")
          Path.join(path, basename)
        end)

      Enum.map(target_files, &IO.inspect/1)
      create_directory(path)

      [target_files, generated_files]
      |> Enum.zip()
      |> Enum.each(fn {target_file, generated_file} ->
        create_file(target_file, generated_file)
      end)
    end)
  end

  defp get_app_module do
    Mix.Project.config()
    |> Keyword.fetch!(:app)
    |> to_string()
    |> Macro.camelize()
  end
end