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}