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)