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 }