Files
Archduino/internal/tui/reporter.go

61 lines
1.3 KiB
Go

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)