defmodule ExCheck.Reporter.Pretty do @moduledoc false @behaviour ExCheck.Reporter alias ExCheck.Printer alias ExCheck.Reporter @impl true def report(results, total_duration, opts) do failed = Enum.filter(results, &match?({:error, _, _}, &1)) reprint_errors(failed) print_summary(results, total_duration, opts) end defp reprint_errors(failed_tools) do Enum.each(failed_tools, fn {_, {name, _, _}, {_, output, _}} -> Printer.info([:red, "=> reprinting errors from "] ++ Reporter.format_tool_name(name)) Printer.info() IO.write(output) if Reporter.output_needs_padding?(output), do: Printer.info() end) end defp print_summary(items, total_duration, opts) do Printer.info([:magenta, "=> finished in ", :bright, Reporter.format_duration(total_duration)]) Printer.info() items |> Enum.sort_by(&Reporter.summary_order/1) |> Enum.each(&print_summary_item(&1, opts)) Printer.info() :ok end defp print_summary_item({:ok, {name, _, opts}, {_, _, duration}}, _) do name = Reporter.format_tool_name(name) took = Reporter.format_duration(duration) mode = if mode = opts[:mode], do: [" ", to_string(mode)], else: [] Printer.info([:green, " ✓ ", name, mode, " success in ", Reporter.bright(took)]) end defp print_summary_item({:error, {name, _, _}, {code, _, duration}}, _) do name = Reporter.format_tool_name(name) took = Reporter.format_duration(duration) Printer.info([ :red, " ✕ ", name, " error code ", Reporter.bright(code), " in ", Reporter.bright(took) ]) end defp print_summary_item({:skipped, name, reason}, opts) do if Keyword.get(opts, :skipped, true) do name = Reporter.format_tool_name(name) reason = format_skip_reason(reason) Printer.info([:cyan, " ", name, " skipped due to ", reason]) end end defp format_skip_reason({:elixir, version}) do ["Elixir version = ", System.version(), ", not ", version] end defp format_skip_reason({:deps, [name | _]}) do ["unsatisfied dependency ", Reporter.format_tool_name(name)] end defp format_skip_reason({:package, name}) do ["missing package ", Reporter.bright(name)] end defp format_skip_reason({:package, name, app}) do ["missing package ", Reporter.bright(name), " in ", Reporter.bright(app)] end defp format_skip_reason({:file, name}) do ["missing file ", Reporter.bright(name)] end defp format_skip_reason({:cd, cd}) do ["missing directory ", Reporter.bright(cd)] end end