Files
elixir-koans/lib/display.ex
Iftakhar Husan 70c76693a6 Improve progress bar
This improves progress bar by:
- Adding progress percentage
- Calculating progress bar underline based on the text length of progress bar
2024-03-01 01:01:14 +02:00

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