drain_test.go

 1package screens
 2
 3import (
 4	tea "charm.land/bubbletea/v2"
 5
 6	"git.secluded.site/keld/internal/ui"
 7)
 8
 9// drain feeds commands back into a screen until a DoneMsg or BackMsg
10// is produced, or the command chain is exhausted. This is necessary
11// because huh uses internal message chains (nextFieldMsg →
12// nextGroupMsg → StateCompleted) that must be processed sequentially.
13func drain[S ui.Screen](s S, initialCmd tea.Cmd) (S, tea.Cmd) {
14	cmd := initialCmd
15	for cmd != nil {
16		msg := cmd()
17		if msg == nil {
18			return s, nil
19		}
20		switch msg.(type) {
21		case ui.DoneMsg:
22			return s, cmd
23		case ui.BackMsg:
24			return s, cmd
25		}
26		var screen ui.Screen
27		screen, cmd = s.Update(msg)
28		s = screen.(S)
29	}
30	return s, nil
31}