github.com/anchore/syft@v1.38.2/syft/pkg/cataloger/haskell/parse_stack_yaml.go (about) 1 package haskell 2 3 import ( 4 "context" 5 "fmt" 6 "io" 7 8 "go.yaml.in/yaml/v3" 9 10 "github.com/anchore/syft/internal/log" 11 "github.com/anchore/syft/internal/unknown" 12 "github.com/anchore/syft/syft/artifact" 13 "github.com/anchore/syft/syft/file" 14 "github.com/anchore/syft/syft/pkg" 15 "github.com/anchore/syft/syft/pkg/cataloger/generic" 16 ) 17 18 var _ generic.Parser = parseStackYaml 19 20 type stackYaml struct { 21 ExtraDeps []string `yaml:"extra-deps"` 22 } 23 24 // parseStackYaml is a parser function for stack.yaml contents, returning all packages discovered. 25 func parseStackYaml(_ context.Context, _ file.Resolver, _ *generic.Environment, reader file.LocationReadCloser) ([]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, "path", reader.RealPath).Trace("failed to parse stack.yaml") 35 return nil, nil, fmt.Errorf("failed to parse stack.yaml file") 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, unknown.IfEmptyf(pkgs, "unable to determine packages") 55 }