Skip to main content

lib/mix/tasks/zoi_forge.clean.ex

defmodule Mix.Tasks.ZoiForge.Clean do
  @moduledoc """
  Removes generated schema modules from the output directory.

      mix zoi_forge.clean
      mix zoi_forge.clean --output lib/schemas
  """

  use Mix.Task

  @shortdoc "Removes generated schema modules"

  @switches [
    output: :string
  ]

  @impl Mix.Task
  def run(args) do
    Mix.Task.run("app.config")

    {opts, _argv, _invalid} = OptionParser.parse(args, strict: @switches)

    output_dir =
      opts
      |> Map.new()
      |> Map.take([:output])
      |> Map.new(fn {_, value} -> {:output_dir, value} end)
      |> Mix.ZoiForge.Config.build()
      |> Keyword.fetch!(:output_dir)

    output_dir = Path.expand(output_dir)

    if File.exists?(output_dir) do
      case File.rm_rf(output_dir) do
        {:ok, _} ->
          Mix.shell().info("Removed generated schemas from #{output_dir}")

        {:error, reason, path} ->
          Mix.raise("failed to remove #{path}: #{inspect(reason)}")
      end
    else
      Mix.shell().info("No generated schemas at #{output_dir}")
    end
  end
end