github.com/anchore/syft@v1.4.2-0.20240516191711-1bec1fc5d397/syft/pkg/cataloger/haskell/parse_stack_yaml.go (about)

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