func getViolations()

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
	}
}