feat(tui): add TeaReporter forwarding engine events to bubbletea
This commit is contained in:
60
internal/tui/reporter.go
Normal file
60
internal/tui/reporter.go
Normal file
@@ -0,0 +1,60 @@
|
||||
package tui
|
||||
|
||||
import (
|
||||
"sync"
|
||||
|
||||
tea "github.com/charmbracelet/bubbletea"
|
||||
|
||||
"github.com/MDietermann/ArduinoArchSetup/internal/module"
|
||||
)
|
||||
|
||||
// ProgressMsg is emitted when a module reports progress during Apply.
|
||||
type ProgressMsg struct {
|
||||
ModuleID string
|
||||
Current int
|
||||
Total int
|
||||
Message string
|
||||
}
|
||||
|
||||
// LogMsg is emitted when a module emits a log line during Apply.
|
||||
type LogMsg struct {
|
||||
ModuleID string
|
||||
Line string
|
||||
}
|
||||
|
||||
// sender abstracts tea.Program.Send so tests can inject a recorder.
|
||||
type sender interface {
|
||||
Send(msg tea.Msg)
|
||||
}
|
||||
|
||||
// TeaReporter implements module.Reporter and forwards every event to a
|
||||
// sender (typically a *tea.Program). Concurrency-safe.
|
||||
type TeaReporter struct {
|
||||
mu sync.Mutex
|
||||
s sender
|
||||
}
|
||||
|
||||
// NewTeaReporter wraps a sender. Passing nil is allowed — events are dropped.
|
||||
func NewTeaReporter(s sender) *TeaReporter {
|
||||
return &TeaReporter{s: s}
|
||||
}
|
||||
|
||||
func (r *TeaReporter) Progress(id string, current, total int, msg string) {
|
||||
r.mu.Lock()
|
||||
defer r.mu.Unlock()
|
||||
if r.s == nil {
|
||||
return
|
||||
}
|
||||
r.s.Send(ProgressMsg{ModuleID: id, Current: current, Total: total, Message: msg})
|
||||
}
|
||||
|
||||
func (r *TeaReporter) Log(id, line string) {
|
||||
r.mu.Lock()
|
||||
defer r.mu.Unlock()
|
||||
if r.s == nil {
|
||||
return
|
||||
}
|
||||
r.s.Send(LogMsg{ModuleID: id, Line: line})
|
||||
}
|
||||
|
||||
var _ module.Reporter = (*TeaReporter)(nil)
|
||||
Reference in New Issue
Block a user