github.com/noqcks/syft@v0.0.0-20230920222752-a9e2c4e288e5/syft/pkg/cataloger/haskell/parse_stack_yaml.go (about)

     1  package haskell
     2  
     3  import (
     4  	"fmt"
     5  	"io"
     6  
     7  	"gopkg.in/yaml.v3"
     8  
     9  	"github.com/anchore/syft/syft/artifact"
    10  	"github.com/anchore/syft/syft/file"
    11  	"github.com/anchore/syft/syft/pkg"
    12  	"github.com/anchore/syft/syft/pkg/cataloger/generic"
    13  )
    14  
    15  var _ generic.Parser = parseStackYaml
    16  
    17  type stackYaml struct {
    18  	ExtraDeps []string `yaml:"extra-deps"`
    19  }
    20  
    21  // parseStackYaml is a parser function for stack.yaml contents, returning all packages discovered.
    22  func parseStackYaml(_ file.Resolver, _ *generic.Environment, reader file.LocationReadCloser) ([]pkg.Package, []artifact.Relationship, error) {
    23  	bytes, err := io.ReadAll(reader)
    24  	if err != nil {
    25  		return nil, nil, fmt.Errorf("failed to load stack.yaml file: %w", err)
    26  	}
    27  
    28  	var stackFile stackYaml
    29  
    30  	if err := yaml.Unmarshal(bytes, &stackFile); err != nil {
    31  		return nil, nil, fmt.Errorf("failed to parse stack.yaml file: %w", err)
    32  	}
    33  
    34  	var pkgs []pkg.Package
    35  	for _, dep := range stackFile.ExtraDeps {
    36  		pkgName, pkgVersion, pkgHash := parseStackPackageEncoding(dep)
    37  		pkgs = append(
    38  			pkgs,
    39  			newPackage(
    40  				pkgName,
    41  				pkgVersion,
    42  				&pkg.HackageMetadata{
    43  					PkgHash: pkgHash,
    44  				},
    45  				reader.Location.WithAnnotation(pkg.EvidenceAnnotationKey, pkg.PrimaryEvidenceAnnotation),
    46  			),
    47  		)
    48  	}
    49  
    50  	return pkgs, nil, nil
    51  }