github.com/nextlinux/gosbom@v0.81.1-0.20230627115839-1ff50c281391/gosbom/event/parsers/parsers.go (about)

     1  /*
     2  Package parsers provides parser helpers to extract payloads for each event type that the gosbom library publishes onto the event bus.
     3  */
     4  package parsers
     5  
     6  import (
     7  	"fmt"
     8  	"io"
     9  
    10  	"github.com/nextlinux/gosbom/gosbom/event"
    11  	"github.com/nextlinux/gosbom/gosbom/event/monitor"
    12  	"github.com/nextlinux/gosbom/gosbom/file/cataloger/secrets"
    13  	"github.com/nextlinux/gosbom/gosbom/pkg/cataloger"
    14  	"github.com/wagoodman/go-partybus"
    15  	"github.com/wagoodman/go-progress"
    16  )
    17  
    18  type ErrBadPayload struct {
    19  	Type  partybus.EventType
    20  	Field string
    21  	Value interface{}
    22  }
    23  
    24  func (e *ErrBadPayload) Error() string {
    25  	return fmt.Sprintf("event='%s' has bad event payload field='%v': '%+v'", string(e.Type), e.Field, e.Value)
    26  }
    27  
    28  func newPayloadErr(t partybus.EventType, field string, value interface{}) error {
    29  	return &ErrBadPayload{
    30  		Type:  t,
    31  		Field: field,
    32  		Value: value,
    33  	}
    34  }
    35  
    36  func checkEventType(actual, expected partybus.EventType) error {
    37  	if actual != expected {
    38  		return newPayloadErr(expected, "Type", actual)
    39  	}
    40  	return nil
    41  }
    42  
    43  func ParsePackageCatalogerStarted(e partybus.Event) (*cataloger.Monitor, error) {
    44  	if err := checkEventType(e.Type, event.PackageCatalogerStarted); err != nil {
    45  		return nil, err
    46  	}
    47  
    48  	monitor, ok := e.Value.(cataloger.Monitor)
    49  	if !ok {
    50  		return nil, newPayloadErr(e.Type, "Value", e.Value)
    51  	}
    52  
    53  	return &monitor, nil
    54  }
    55  
    56  func ParseSecretsCatalogingStarted(e partybus.Event) (*secrets.Monitor, error) {
    57  	if err := checkEventType(e.Type, event.SecretsCatalogerStarted); err != nil {
    58  		return nil, err
    59  	}
    60  
    61  	monitor, ok := e.Value.(secrets.Monitor)
    62  	if !ok {
    63  		return nil, newPayloadErr(e.Type, "Value", e.Value)
    64  	}
    65  
    66  	return &monitor, nil
    67  }
    68  
    69  func ParseFileMetadataCatalogingStarted(e partybus.Event) (progress.StagedProgressable, error) {
    70  	if err := checkEventType(e.Type, event.FileMetadataCatalogerStarted); err != nil {
    71  		return nil, err
    72  	}
    73  
    74  	prog, ok := e.Value.(progress.StagedProgressable)
    75  	if !ok {
    76  		return nil, newPayloadErr(e.Type, "Value", e.Value)
    77  	}
    78  
    79  	return prog, nil
    80  }
    81  
    82  func ParseFileDigestsCatalogingStarted(e partybus.Event) (progress.StagedProgressable, error) {
    83  	if err := checkEventType(e.Type, event.FileDigestsCatalogerStarted); err != nil {
    84  		return nil, err
    85  	}
    86  
    87  	prog, ok := e.Value.(progress.StagedProgressable)
    88  	if !ok {
    89  		return nil, newPayloadErr(e.Type, "Value", e.Value)
    90  	}
    91  
    92  	return prog, nil
    93  }
    94  
    95  func ParseFileIndexingStarted(e partybus.Event) (string, progress.StagedProgressable, error) {
    96  	if err := checkEventType(e.Type, event.FileIndexingStarted); err != nil {
    97  		return "", nil, err
    98  	}
    99  
   100  	path, ok := e.Source.(string)
   101  	if !ok {
   102  		return "", nil, newPayloadErr(e.Type, "Source", e.Source)
   103  	}
   104  
   105  	prog, ok := e.Value.(progress.StagedProgressable)
   106  	if !ok {
   107  		return "", nil, newPayloadErr(e.Type, "Value", e.Value)
   108  	}
   109  
   110  	return path, prog, nil
   111  }
   112  
   113  func ParseCatalogerTaskStarted(e partybus.Event) (*event.CatalogerTask, error) {
   114  	if err := checkEventType(e.Type, event.CatalogerTaskStarted); err != nil {
   115  		return nil, err
   116  	}
   117  
   118  	source, ok := e.Source.(*event.CatalogerTask)
   119  	if !ok {
   120  		return nil, newPayloadErr(e.Type, "Source", e.Source)
   121  	}
   122  
   123  	return source, nil
   124  }
   125  
   126  func ParseExit(e partybus.Event) (func() error, error) {
   127  	if err := checkEventType(e.Type, event.Exit); err != nil {
   128  		return nil, err
   129  	}
   130  
   131  	fn, ok := e.Value.(func() error)
   132  	if !ok {
   133  		return nil, newPayloadErr(e.Type, "Value", e.Value)
   134  	}
   135  
   136  	return fn, nil
   137  }
   138  
   139  func ParseAppUpdateAvailable(e partybus.Event) (string, error) {
   140  	if err := checkEventType(e.Type, event.AppUpdateAvailable); err != nil {
   141  		return "", err
   142  	}
   143  
   144  	newVersion, ok := e.Value.(string)
   145  	if !ok {
   146  		return "", newPayloadErr(e.Type, "Value", e.Value)
   147  	}
   148  
   149  	return newVersion, nil
   150  }
   151  
   152  func ParseImportStarted(e partybus.Event) (string, progress.StagedProgressable, error) {
   153  	if err := checkEventType(e.Type, event.ImportStarted); err != nil {
   154  		return "", nil, err
   155  	}
   156  
   157  	host, ok := e.Source.(string)
   158  	if !ok {
   159  		return "", nil, newPayloadErr(e.Type, "Source", e.Source)
   160  	}
   161  
   162  	prog, ok := e.Value.(progress.StagedProgressable)
   163  	if !ok {
   164  		return "", nil, newPayloadErr(e.Type, "Value", e.Value)
   165  	}
   166  
   167  	return host, prog, nil
   168  }
   169  
   170  func ParseAttestationStartedEvent(e partybus.Event) (io.Reader, progress.Progressable, *monitor.GenericTask, error) {
   171  	if err := checkEventType(e.Type, event.AttestationStarted); err != nil {
   172  		return nil, nil, nil, err
   173  	}
   174  
   175  	source, ok := e.Source.(monitor.GenericTask)
   176  	if !ok {
   177  		return nil, nil, nil, newPayloadErr(e.Type, "Source", e.Source)
   178  	}
   179  
   180  	sp, ok := e.Value.(*monitor.ShellProgress)
   181  	if !ok {
   182  		return nil, nil, nil, newPayloadErr(e.Type, "Value", e.Value)
   183  	}
   184  
   185  	return sp.Reader, sp.Manual, &source, nil
   186  }