fix: remove the silly map

AI generated code is still not perfect...
This commit is contained in:
Hayden Hargreaves 2026-04-14 22:54:26 -07:00
parent 7bcf8e8301
commit d51d1fea56
4 changed files with 52 additions and 59 deletions

11
internal/tui/messages.go Normal file
View File

@ -0,0 +1,11 @@
package tui
import "termtap.dev/internal/model"
type EventMsg struct {
value model.Event
}
type ErrMsg struct {
err error
}

View File

@ -4,58 +4,48 @@ import (
"fmt" "fmt"
tea "github.com/charmbracelet/bubbletea" tea "github.com/charmbracelet/bubbletea"
"github.com/google/uuid"
"termtap.dev/internal/model" "termtap.dev/internal/model"
) )
// TODO: How big can we actually make this?
const ( const (
maxEvents = 200 maxEvents = 256
maxRequests = 200 maxRequests = 256
) )
type EventMsg struct {
value model.Event
}
type ErrMsg struct {
err error
}
type Model struct { type Model struct {
msgCh <-chan model.Event channel <-chan model.Event
events []model.Event events []model.Event
requestOrder []uuid.UUID requests []model.Request
requests map[uuid.UUID]model.Request
width int width int
height int height int
} }
func NewModel(msgCh <-chan model.Event) Model { func NewModel(ch <-chan model.Event) Model {
return Model{ return Model{
msgCh: msgCh, channel: ch,
events: make([]model.Event, 0, maxEvents), events: make([]model.Event, 0, maxEvents),
requestOrder: make([]uuid.UUID, 0, maxRequests), requests: make([]model.Request, 0, maxRequests),
requests: map[uuid.UUID]model.Request{}, width: 100,
width: 100, height: 28,
height: 28,
} }
} }
func Run(msgCh <-chan model.Event) error { func Run(ch <-chan model.Event) error {
p := tea.NewProgram(NewModel(msgCh), tea.WithAltScreen()) p := tea.NewProgram(NewModel(ch), tea.WithAltScreen())
_, err := p.Run() _, err := p.Run()
return err return err
} }
func (m Model) Init() tea.Cmd { func (m Model) Init() tea.Cmd {
return waitForAppMessage(m.msgCh) return waitForEvent(m.channel)
} }
func waitForAppMessage(msgCh <-chan model.Event) tea.Cmd { func waitForEvent(ch <-chan model.Event) tea.Cmd {
return func() tea.Msg { return func() tea.Msg {
msg, ok := <-msgCh msg, ok := <-ch
if !ok { if !ok {
return ErrMsg{err: fmt.Errorf("event channel closed")} return ErrMsg{err: fmt.Errorf("event channel closed")}
} }

View File

@ -4,7 +4,6 @@ import (
"fmt" "fmt"
tea "github.com/charmbracelet/bubbletea" tea "github.com/charmbracelet/bubbletea"
"github.com/google/uuid"
"termtap.dev/internal/model" "termtap.dev/internal/model"
) )
@ -32,7 +31,7 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
case EventMsg: case EventMsg:
m.pushEvent(msg.value) m.pushEvent(msg.value)
m.applyMessage(msg.value) m.applyMessage(msg.value)
return m, waitForAppMessage(m.msgCh) return m, waitForEvent(m.channel)
} }
return m, nil return m, nil
@ -48,30 +47,29 @@ func (m *Model) pushEvent(msg model.Event) {
func (m *Model) applyMessage(msg model.Event) { func (m *Model) applyMessage(msg model.Event) {
switch msg.Type { switch msg.Type {
case model.EventTypeRequestStarted: case model.EventTypeRequestStarted:
m.upsertRequest(msg.Request, true) m.createRequest(msg.Request)
case model.EventTypeRequestFinished, model.EventTypeRequestFailed: case model.EventTypeRequestFinished, model.EventTypeRequestFailed:
m.upsertRequest(msg.Request, false) m.updateRequest(msg.Request)
} }
} }
func (m *Model) upsertRequest(req model.Request, addIfMissing bool) { func (m *Model) createRequest(req model.Request) {
if req.ID == uuid.Nil { m.requests = append(m.requests, req)
return
}
_, exists := m.requests[req.ID] // If we passed the max, delete the first one
if !exists && !addIfMissing { // Maybe we should notify the user?
return if len(m.requests) > maxRequests {
m.requests = m.requests[1:]
} }
}
if !exists { func (m *Model) updateRequest(req model.Request) {
m.requestOrder = append(m.requestOrder, req.ID) // Traverse backward, since the newest one is at the end, and its likely we will be
if len(m.requestOrder) > maxRequests { // updated a new request.
drop := m.requestOrder[0] for i := len(m.requests) - 1; i >= 0; i-- {
delete(m.requests, drop) if m.requests[i].ID == req.ID {
m.requestOrder = m.requestOrder[1:] m.requests[i] = req
break
} }
} }
m.requests[req.ID] = req
} }

View File

@ -14,7 +14,7 @@ func (m Model) View() string {
return strings.Join([]string{ return strings.Join([]string{
"termtap - live session", "termtap - live session",
fmt.Sprintf("events=%d requests=%d", len(m.events), len(m.requestOrder)), fmt.Sprintf("events=%d requests=%d", len(m.events), len(m.requests)),
"keys: q/esc/ctrl+c quit", "keys: q/esc/ctrl+c quit",
"", "",
"Recent events:", "Recent events:",
@ -42,22 +42,16 @@ func (m Model) renderEvents(limit int) string {
} }
func (m Model) renderRequests(limit int) string { func (m Model) renderRequests(limit int) string {
if len(m.requestOrder) == 0 { if len(m.requests) == 0 {
return " (none yet)" return " (none yet)"
} }
start := len(m.requestOrder) - limit start := max(0, len(m.requests)-limit)
if start < 0 {
start = 0
}
rows := make([]string, 0, len(m.requestOrder)-start) // Traverse backwards since we don't have a stack
for i := start; i < len(m.requestOrder); i++ { rows := make([]string, 0, len(m.requests)-start)
id := m.requestOrder[i] for i := len(m.requests) - 1; i >= start; i-- {
req, ok := m.requests[id] req := m.requests[i]
if !ok {
continue
}
state := "done" state := "done"
if req.Pending { if req.Pending {