termtap/internal/tui/update.go
2026-04-14 21:58:56 -07:00

78 lines
1.5 KiB
Go

package tui
import (
"fmt"
tea "github.com/charmbracelet/bubbletea"
"github.com/google/uuid"
"termtap.dev/internal/model"
)
func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
switch msg := msg.(type) {
case tea.WindowSizeMsg:
m.width = msg.Width
m.height = msg.Height
return m, nil
case tea.KeyMsg:
switch msg.String() {
case "ctrl+c", "q", "esc":
return m, tea.Quit
}
return m, nil
case modelErrMsg:
m.events = append(m.events, model.Message{
Type: model.MessageTypeWarn,
Body: fmt.Sprintf("tui event stream closed: %v", msg.err),
})
return m, nil
case appMsg:
m.pushEvent(msg.value)
m.applyMessage(msg.value)
return m, waitForAppMessage(m.msgCh)
}
return m, nil
}
func (m *Model) pushEvent(msg model.Message) {
m.events = append(m.events, msg)
if len(m.events) > maxEvents {
m.events = m.events[len(m.events)-maxEvents:]
}
}
func (m *Model) applyMessage(msg model.Message) {
switch msg.Type {
case model.MessageTypeRequestStarted:
m.upsertRequest(msg.Request, true)
case model.MessageTypeRequestFinished, model.MessageTypeRequestFailed:
m.upsertRequest(msg.Request, false)
}
}
func (m *Model) upsertRequest(req model.Request, addIfMissing bool) {
if req.ID == uuid.Nil {
return
}
_, exists := m.requests[req.ID]
if !exists && !addIfMissing {
return
}
if !exists {
m.requestOrder = append(m.requestOrder, req.ID)
if len(m.requestOrder) > maxRequests {
drop := m.requestOrder[0]
delete(m.requests, drop)
m.requestOrder = m.requestOrder[1:]
}
}
m.requests[req.ID] = req
}