lib/recode/task/format.ex

defmodule Recode.Task.Format do
  @moduledoc """
  This task runs the Elixir formatter.

  This task runs as first task by any `mix recode` call.
  """

  use Recode.Task, correct: true, check: true

  alias Recode.Issue
  alias Recode.Task.Format
  alias Rewrite.Source

  @impl Recode.Task
  def run(source, opts) do
    source
    |> Source.Ex.merge_formatter_opts(exclude_plugins: [Recode.FormatterPlugin])
    |> format(opts[:autocorrect])
  end

  defp format(source, true) do
    Source.update(source, Format, :content, Source.Ex.format(source))
  end

  defp format(source, false) do
    case Source.get(source, :content) == Source.Ex.format(source) do
      true ->
        source

      false ->
        Source.add_issue(source, Issue.new(Format, "The file is not formatted."))
    end
  end
end