diff --git a/cardsim/messages.go b/cardsim/messages.go index acb0a6a..456c60a 100644 --- a/cardsim/messages.go +++ b/cardsim/messages.go @@ -1,6 +1,9 @@ package cardsim -import "fmt" +import ( + "fmt" + "strings" +) // Message is an opaque interface representing a displayable message. // Using an interface here allows for implementation of new message display @@ -56,3 +59,19 @@ func IsSpecialMessage(m Message, s *SpecialMessage) bool { } return false } + +// MultiMessage is a sequence of messages treated like one message. +type MultiMessage []Message + +func (m MultiMessage) String() string { + s := make([]string, len(m)) + for i, msg := range m { + if msg == nil { + s[i] = "" + continue + } + s[i] = msg.String() + continue + } + return strings.Join(s, "\n") +} diff --git a/cardsim/terminalui.go b/cardsim/terminalui.go index 0a7e19f..22e3e79 100644 --- a/cardsim/terminalui.go +++ b/cardsim/terminalui.go @@ -63,7 +63,7 @@ func pickNextAction[C StatsCollection](p *Player[C]) (isCard bool, cardIdx int, if needsDivider { divider() } - displayPrompt(p) + displayOnePanel(p, p.Prompt) actionsOffset := displayStatsMenu(p) handOffset := displayPermanentActionsMenu(p, actionsOffset) max := displayHandMenu(p, handOffset) @@ -143,3 +143,25 @@ func confirmQuit() { os.Exit(0) } } + +func displayOnePanel[C StatsCollection](p *Player[C], panel InfoPanel[C]) error { + var errs ErrorCollector + t, err := panel.Title(p) + if IsSeriousError(err) { + return err + } + errs.Add(err) + ts := t.String() + if len(ts) > 0 { + fmt.Println(ts) + fmt.Println(strings.Repeat("-", len(ts))) + fmt.Println() + } + m, err := panel.Info(p) + errs.Add(err) + if IsSeriousError(err) { + return errs.Emit() + } + displayAndWait(MultiMessage(m)) + return errs.Emit() +}