github.com/lineaje-labs/syft@v0.98.1-0.20231227153149-9e393f60ff1b/cmd/syft/cli/ui/handler.go (about)

     1  package ui
     2  
     3  import (
     4  	"sync"
     5  
     6  	tea "github.com/charmbracelet/bubbletea"
     7  	"github.com/wagoodman/go-partybus"
     8  
     9  	"github.com/anchore/bubbly"
    10  	"github.com/anchore/bubbly/bubbles/taskprogress"
    11  	stereoscopeEvent "github.com/anchore/stereoscope/pkg/event"
    12  	syftEvent "github.com/anchore/syft/syft/event"
    13  )
    14  
    15  var _ interface {
    16  	bubbly.EventHandler
    17  	bubbly.MessageListener
    18  	bubbly.HandleWaiter
    19  } = (*Handler)(nil)
    20  
    21  type HandlerConfig struct {
    22  	TitleWidth        int
    23  	AdjustDefaultTask func(taskprogress.Model) taskprogress.Model
    24  }
    25  
    26  type Handler struct {
    27  	WindowSize tea.WindowSizeMsg
    28  	Running    *sync.WaitGroup
    29  	Config     HandlerConfig
    30  
    31  	bubbly.EventHandler
    32  }
    33  
    34  func DefaultHandlerConfig() HandlerConfig {
    35  	return HandlerConfig{
    36  		TitleWidth: 30,
    37  	}
    38  }
    39  
    40  func New(cfg HandlerConfig) *Handler {
    41  	d := bubbly.NewEventDispatcher()
    42  
    43  	h := &Handler{
    44  		EventHandler: d,
    45  		Running:      &sync.WaitGroup{},
    46  		Config:       cfg,
    47  	}
    48  
    49  	// register all supported event types with the respective handler functions
    50  	d.AddHandlers(map[partybus.EventType]bubbly.EventHandlerFn{
    51  		stereoscopeEvent.PullDockerImage:       h.handlePullDockerImage,
    52  		stereoscopeEvent.PullContainerdImage:   h.handlePullContainerdImage,
    53  		stereoscopeEvent.ReadImage:             h.handleReadImage,
    54  		stereoscopeEvent.FetchImage:            h.handleFetchImage,
    55  		syftEvent.PackageCatalogerStarted:      h.handlePackageCatalogerStarted,
    56  		syftEvent.FileDigestsCatalogerStarted:  h.handleFileDigestsCatalogerStarted,
    57  		syftEvent.FileMetadataCatalogerStarted: h.handleFileMetadataCatalogerStarted,
    58  		syftEvent.FileIndexingStarted:          h.handleFileIndexingStarted,
    59  		syftEvent.AttestationStarted:           h.handleAttestationStarted,
    60  		syftEvent.CatalogerTaskStarted:         h.handleCatalogerTaskStarted,
    61  	})
    62  
    63  	return h
    64  }
    65  
    66  func (m *Handler) OnMessage(msg tea.Msg) {
    67  	if msg, ok := msg.(tea.WindowSizeMsg); ok {
    68  		m.WindowSize = msg
    69  	}
    70  }
    71  
    72  func (m *Handler) Wait() {
    73  	m.Running.Wait()
    74  }