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 }