78 lines
1.5 KiB
Go
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
|
|
}
|