github.com/lineaje-labs/syft@v0.98.1-0.20231227153149-9e393f60ff1b/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  	"github.com/lineaje-labs/syft/internal/log"
    14  )
    15  
    16  var _ generic.Parser = parseStackYaml
    17  
    18  type stackYaml struct {
    19  	ExtraDeps []string `yaml:"extra-deps"`
    20  }
    21  
    22  // parseStackYaml is a parser function for stack.yaml contents, returning all packages discovered.
    23  func parseStackYaml(
    24  	_ file.Resolver, _ *generic.Environment, reader file.LocationReadCloser,
    25  ) ([]pkg.Package, []artifact.Relationship, error) {
    26  	bytes, err := io.ReadAll(reader)
    27  	if err != nil {
    28  		return nil, nil, fmt.Errorf("failed to load stack.yaml file: %w", err)
    29  	}
    30  
    31  	var stackFile stackYaml
    32  
    33  	if err := yaml.Unmarshal(bytes, &stackFile); err != nil {
    34  		log.WithFields("error", err).Tracef("failed to parse stack.yaml file %q", reader.RealPath)
    35  		return nil, nil, nil
    36  	}
    37  
    38  	var pkgs []pkg.Package
    39  	for _, dep := range stackFile.ExtraDeps {
    40  		pkgName, pkgVersion, pkgHash := parseStackPackageEncoding(dep)
    41  		pkgs = append(
    42  			pkgs,
    43  			newPackage(
    44  				pkgName,
    45  				pkgVersion,
    46  				pkg.HackageStackYamlEntry{
    47  					PkgHash: pkgHash,
    48  				},
    49  				reader.Location,
    50  			),
    51  		)
    52  	}
    53  
    54  	return pkgs, nil, nil
    55  }