github.com/nextlinux/gosbom@v0.81.1-0.20230627115839-1ff50c281391/gosbom/pkg/cataloger/haskell/parse_stack_yaml.go (about) 1 package haskell 2 3 import ( 4 "fmt" 5 "io" 6 7 "github.com/nextlinux/gosbom/gosbom/artifact" 8 "github.com/nextlinux/gosbom/gosbom/file" 9 "github.com/nextlinux/gosbom/gosbom/pkg" 10 "github.com/nextlinux/gosbom/gosbom/pkg/cataloger/generic" 11 "gopkg.in/yaml.v3" 12 ) 13 14 var _ generic.Parser = parseStackYaml 15 16 type stackYaml struct { 17 ExtraDeps []string `yaml:"extra-deps"` 18 } 19 20 // parseStackYaml is a parser function for stack.yaml contents, returning all packages discovered. 21 func parseStackYaml(_ file.Resolver, _ *generic.Environment, reader file.LocationReadCloser) ([]pkg.Package, []artifact.Relationship, error) { 22 bytes, err := io.ReadAll(reader) 23 if err != nil { 24 return nil, nil, fmt.Errorf("failed to load stack.yaml file: %w", err) 25 } 26 27 var stackFile stackYaml 28 29 if err := yaml.Unmarshal(bytes, &stackFile); err != nil { 30 return nil, nil, fmt.Errorf("failed to parse stack.yaml file: %w", err) 31 } 32 33 var pkgs []pkg.Package 34 for _, dep := range stackFile.ExtraDeps { 35 pkgName, pkgVersion, pkgHash := parseStackPackageEncoding(dep) 36 pkgs = append( 37 pkgs, 38 newPackage( 39 pkgName, 40 pkgVersion, 41 &pkg.HackageMetadata{ 42 PkgHash: pkgHash, 43 }, 44 reader.Location.WithAnnotation(pkg.EvidenceAnnotationKey, pkg.PrimaryEvidenceAnnotation), 45 ), 46 ) 47 } 48 49 return pkgs, nil, nil 50 }