defmodule UI do require Logger def confirm(msg), do: confirm(msg, false) def confirm(_msg, true), do: true def confirm(msg, _default) do IO.write("#{msg} (y/n) ") case IO.gets("") do "y\n" -> true "Y\n" -> true _ -> false end end def flush do Logger.flush() end def report_step(msg), do: info(msg) def report_step(msg, detail), do: info(msg, detail) def begin_step(msg, detail \\ nil) do if is_nil(detail) do Logger.info(IO.ANSI.format([:green, msg, :reset], colorize?())) else Logger.info(IO.ANSI.format([:green, msg, :reset, ": ", :cyan, detail, :reset], colorize?())) end end def end_step(msg, detail \\ nil) do if is_nil(detail) do Logger.info(IO.ANSI.format([:yellow, msg, :reset], colorize?())) else Logger.info( IO.ANSI.format([:yellow, msg, :reset, ": ", :cyan, detail, :reset], colorize?()) ) end end def inspect(item, label) do Logger.debug(label, Kernel.inspect(item, pretty: true, binaries: :as_strings)) Logger.flush() item end def debug(msg) do Logger.debug(IO.ANSI.format([:green, msg, :reset], colorize?())) end def debug(msg, detail) do Logger.debug(IO.ANSI.format([:green, msg, :reset, ": ", :cyan, detail, :reset], colorize?())) end def info(msg) do Logger.info(IO.ANSI.format([:green, msg, :reset], colorize?())) end def info(msg, detail) do Logger.info(IO.ANSI.format([:green, msg, :reset, ": ", :cyan, detail, :reset], colorize?())) end def warn(msg) do Logger.warning(IO.ANSI.format([:yellow, msg, :reset], colorize?())) end def warn(msg, detail) do Logger.warning( IO.ANSI.format([:yellow, msg, :reset, ": ", :cyan, detail, :reset], colorize?()) ) end def error(msg) do Logger.error(IO.ANSI.format([:red, msg, :reset], colorize?())) end def error(msg, detail) do Logger.error(IO.ANSI.format([:red, msg, :reset, ": ", :cyan, detail, :reset], colorize?())) end defp colorize? do :prim_tty.isatty(:stderr) end end