lib/mix/tasks/tidy.ex

defmodule Mix.Tasks.Tidy do
  use Mix.Task

  @shortdoc "Run tidy analysis."
  @moduledoc @shortdoc

  @doc false
  def run(_argv) do
    Mix.Task.run("compile")

    app =
      ~r/app: *:([a-z\_]+)/
      |> Regex.scan(File.read!("./mix.exs"), capture: :all_but_first)
      |> Enum.find_value(&try_load/1)

    analysis = Tidy.analyze_app(app)

    analysis
    |> Enum.map(&Tidy.errors/1)
    |> IO.puts()

    exit({:shutdown, Tidy.errors?(analysis)})
  end

  defp try_load(app)

  defp try_load([app]) do
    name = String.to_existing_atom(app)

    if Application.ensure_loaded(name) == :ok, do: name
  rescue
    _ -> nil
  end
end