
This improves progress bar by: - Adding progress percentage - Calculating progress bar underline based on the text length of progress bar
75 lines
1.6 KiB
Elixir
75 lines
1.6 KiB
Elixir
defmodule Display do
|
|
@moduledoc false
|
|
use GenServer
|
|
|
|
alias IO.ANSI
|
|
alias Display.{Failure, Intro, Notifications, ProgressBar}
|
|
|
|
def start_link do
|
|
GenServer.start_link(__MODULE__, %{clear_screen: true}, name: __MODULE__)
|
|
end
|
|
|
|
def init(args) do
|
|
{:ok, args}
|
|
end
|
|
|
|
def disable_clear do
|
|
GenServer.cast(__MODULE__, :disable_clear)
|
|
end
|
|
|
|
def handle_cast(:disable_clear, state) do
|
|
{:noreply, %{state | clear_screen: false}}
|
|
end
|
|
|
|
def handle_call(:clear_screen, _from, %{clear_screen: true} = state) do
|
|
ANSI.clear <> ANSI.home |> IO.puts()
|
|
|
|
{:reply, :ok, state}
|
|
end
|
|
|
|
def handle_call(:clear_screen, _from, state) do
|
|
{:reply, :ok, state}
|
|
end
|
|
|
|
def invalid_koan(koan, modules) do
|
|
Notifications.invalid_koan(koan, modules)
|
|
|> IO.puts()
|
|
end
|
|
|
|
def show_failure(failure, module, name) do
|
|
format(failure, module, name)
|
|
|> IO.puts()
|
|
end
|
|
|
|
def show_compile_error(error) do
|
|
Failure.show_compile_error(error)
|
|
|> IO.puts()
|
|
end
|
|
|
|
def congratulate do
|
|
Notifications.congratulate()
|
|
|> IO.puts()
|
|
end
|
|
|
|
def clear_screen do
|
|
GenServer.call(__MODULE__, :clear_screen)
|
|
end
|
|
|
|
defp format(failure, module, name) do
|
|
progress_bar = ProgressBar.progress_bar(Tracker.summarize())
|
|
progress_bar_underline = String.duplicate("-", String.length(progress_bar))
|
|
"""
|
|
#{Intro.intro(module, Tracker.visited())}
|
|
Now meditate upon #{format_module(module)}
|
|
#{progress_bar}
|
|
#{progress_bar_underline}
|
|
#{name}
|
|
#{Failure.format_failure(failure)}
|
|
"""
|
|
end
|
|
|
|
defp format_module(module) do
|
|
Module.split(module) |> List.last()
|
|
end
|
|
end
|