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  }