defmodule Hangman.Text.Client.Summary do
@moduledoc """
Displays a summary of the game.
"""
alias IO.ANSI.Plus, as: ANSI
alias Hangman.Text.Client.State
@sp " "
@doc """
Displays a summary of the game.
"""
@spec display(State.t()) :: State.t()
def display(state) do
message(state) |> ANSI.puts()
state
end
## Private functions
# Word so far: _ a n a g e d
# Guesses left: 2
# Letters used: a d e f g n r t u y
@spec message(State.t()) :: ANSI.ansilist()
defp message(%State{tally: %{turns_left: 1} = tally}) do
# Message highlighted to signal last guess...
[
:reset,
:light_yellow,
"\nWord so far: ",
:light_magenta,
"#{Enum.join(tally.letters, @sp)}",
:light_yellow,
"\nGuesses left: ",
:light_magenta,
"1",
:light_yellow,
"\nLetters used: ",
:light_magenta,
"#{Enum.join(tally.guesses, @sp)}\n"
]
end
defp message(%State{tally: tally}) do
[
:reset,
:light_white,
"\nWord so far: ",
:light_cyan,
"#{Enum.join(tally.letters, @sp)}",
:light_white,
"\nGuesses left: ",
:light_cyan,
"#{tally.turns_left}",
:light_white,
"\nLetters used: ",
:light_cyan,
"#{Enum.join(tally.guesses, @sp)}\n"
]
end
end