github.com/noqcks/syft@v0.0.0-20230920222752-a9e2c4e288e5/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.ReadImage:             h.handleReadImage,
    53  		stereoscopeEvent.FetchImage:            h.handleFetchImage,
    54  		syftEvent.PackageCatalogerStarted:      h.handlePackageCatalogerStarted,
    55  		syftEvent.FileDigestsCatalogerStarted:  h.handleFileDigestsCatalogerStarted,
    56  		syftEvent.FileMetadataCatalogerStarted: h.handleFileMetadataCatalogerStarted,
    57  		syftEvent.FileIndexingStarted:          h.handleFileIndexingStarted,
    58  		syftEvent.AttestationStarted:           h.handleAttestationStarted,
    59  		syftEvent.CatalogerTaskStarted:         h.handleCatalogerTaskStarted,
    60  
    61  		// deprecated
    62  		syftEvent.SecretsCatalogerStarted: h.handleSecretsCatalogerStarted,
    63  	})
    64  
    65  	return h
    66  }
    67  
    68  func (m *Handler) OnMessage(msg tea.Msg) {
    69  	if msg, ok := msg.(tea.WindowSizeMsg); ok {
    70  		m.WindowSize = msg
    71  	}
    72  }
    73  
    74  func (m *Handler) Wait() {
    75  	m.Running.Wait()
    76  }