in cli/scorecard/violations.go [113:162]
func getViolations(inventory *InventoryConfig, config *ScoringConfig) ([]*RichViolation, error) {
var err error
var pbAssets []*validator.Asset
if inventory.bucketName != "" {
pbAssets, err = getDataFromBucket(inventory.bucketName)
if err != nil {
return nil, errors.Wrap(err, "Fetching inventory from Bucket")
}
} else if inventory.dirPath != "" {
pbAssets, err = getDataFromFile(inventory.dirPath)
if err != nil {
return nil, errors.Wrap(err, "Fetching inventory from local directory")
}
} else if inventory.readFromStdin {
pbAssets, err = getDataFromStdin()
if err != nil {
return nil, errors.Wrap(err, "Reading from stdin")
}
}
richViolations := make([]*RichViolation, 0)
wp := workerpool.New(inventory.workers)
var badAsset *validator.Asset
var mu sync.Mutex
for _, asset := range pbAssets {
asset := asset
wp.Submit(func() {
violations, errAsset := config.validator.ReviewAsset(context.Background(), asset)
if errAsset != nil {
err = errAsset
badAsset = asset
wp.Stop()
}
for _, violation := range violations {
richViolation := RichViolation{violation, "", violation.Resource, violation.Message, violation.Metadata, asset}
mu.Lock()
richViolations = append(richViolations, &richViolation)
mu.Unlock()
}
})
}
wp.StopWait()
if err != nil {
return nil, errors.Wrapf(err, "reviewing asset %s", badAsset)
} else {
return richViolations, nil
}
}