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 }