61 lines
1.3 KiB
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)
|