github.com/tilt-dev/tilt@v0.33.15-0.20240515162809-0a22ed45d8a0/internal/hud/terminal_stream.go (about)

     1  package hud
     2  
     3  import (
     4  	"context"
     5  
     6  	"github.com/tilt-dev/tilt/internal/store"
     7  	"github.com/tilt-dev/tilt/pkg/model/logstore"
     8  )
     9  
    10  type TerminalStream struct {
    11  	ProcessedLogs logstore.Checkpoint
    12  	printer       *IncrementalPrinter
    13  	store         store.RStore
    14  }
    15  
    16  func NewTerminalStream(printer *IncrementalPrinter, store store.RStore) *TerminalStream {
    17  	return &TerminalStream{printer: printer, store: store}
    18  }
    19  
    20  // TODO(nick): We should change this API so that TearDown gets
    21  // the RStore one last time.
    22  func (h *TerminalStream) TearDown(ctx context.Context) {
    23  	if !h.isEnabled(h.store) {
    24  		return
    25  	}
    26  
    27  	_ = h.OnChange(ctx, h.store, store.LegacyChangeSummary())
    28  
    29  	state := h.store.RLockState()
    30  	uncompleted := state.LogStore.IsLastSegmentUncompleted()
    31  	h.store.RUnlockState()
    32  
    33  	if uncompleted {
    34  		h.printer.PrintNewline()
    35  	}
    36  }
    37  
    38  func (h *TerminalStream) isEnabled(st store.RStore) bool {
    39  	state := st.RLockState()
    40  	defer st.RUnlockState()
    41  	return state.TerminalMode == store.TerminalModeStream
    42  }
    43  
    44  func (h *TerminalStream) OnChange(ctx context.Context, st store.RStore, _ store.ChangeSummary) error {
    45  	if !h.isEnabled(st) {
    46  		return nil
    47  	}
    48  
    49  	state := st.RLockState()
    50  	lines := state.LogStore.ContinuingLines(h.ProcessedLogs)
    51  	checkpoint := state.LogStore.Checkpoint()
    52  	st.RUnlockState()
    53  
    54  	h.printer.Print(lines)
    55  	h.ProcessedLogs = checkpoint
    56  	return nil
    57  }
    58  
    59  var _ store.TearDowner = &TerminalStream{}