dynamo-browse/internal/dynamo-browse/controllers/jobs.go
Leon Mika 32ae488066
All checks were successful
ci / build (push) Successful in 3m17s
Moved package to lmika.dev/cmd/dynamo-browse
2025-05-26 22:04:23 +10:00

70 lines
1.7 KiB
Go

package controllers
import (
tea "github.com/charmbracelet/bubbletea"
"lmika.dev/cmd/dynamo-browse/internal/common/ui/events"
"lmika.dev/cmd/dynamo-browse/internal/dynamo-browse/services/jobs"
bus "github.com/lmika/events"
"log"
)
type JobsController struct {
service *jobs.Services
msgSender func(msg tea.Msg)
immediate bool
}
func NewJobsController(service *jobs.Services, bus *bus.Bus, immediate bool) *JobsController {
jc := &JobsController{
service: service,
immediate: immediate,
}
bus.On(jobs.JobStartEvent, func(job jobs.EventData) { jc.sendForegroundJobState(job.Job, "") })
bus.On(jobs.JobIdleEvent, func() { jc.sendForegroundJobState(nil, "") })
bus.On(jobs.JobUpdateEvent, func(job jobs.EventData, update string) { jc.sendForegroundJobState(job.Job, update) })
return jc
}
func (js *JobsController) SetMessageSender(msgSender func(msg tea.Msg)) {
js.msgSender = msgSender
}
func (js *JobsController) CancelRunningJob(ifNoJobsRunning func() tea.Msg) tea.Msg {
hasCancelled := js.service.CancelForegroundJob()
if hasCancelled {
return events.ForegroundJobUpdate{
JobRunning: true,
JobStatus: "Cancelling running job…",
}
}
return ifNoJobsRunning()
}
func (jc *JobsController) sendForegroundJobState(job jobs.Job, update string) {
if job == nil {
log.Printf("job service idle")
jc.msgSender(events.ForegroundJobUpdate{
JobRunning: false,
})
return
}
var statusMessage string
if dj, ok := job.(jobs.DescribableJob); ok {
statusMessage = dj.Description
} else {
statusMessage = "Working…"
}
if len(update) > 0 {
statusMessage += " " + update
}
log.Printf("job update: %v", statusMessage)
jc.msgSender(events.ForegroundJobUpdate{
JobRunning: true,
JobStatus: statusMessage,
})
}