github.com/anchore/syft@v1.4.2-0.20240516191711-1bec1fc5d397/syft/pkg/cataloger/haskell/parse_cabal_freeze.go (about)

     1  package haskell
     2  
     3  import (
     4  	"bufio"
     5  	"context"
     6  	"errors"
     7  	"fmt"
     8  	"io"
     9  	"strings"
    10  
    11  	"github.com/anchore/syft/syft/artifact"
    12  	"github.com/anchore/syft/syft/file"
    13  	"github.com/anchore/syft/syft/pkg"
    14  	"github.com/anchore/syft/syft/pkg/cataloger/generic"
    15  )
    16  
    17  var _ generic.Parser = parseCabalFreeze
    18  
    19  // parseCabalFreeze is a parser function for cabal.project.freeze contents, returning all packages discovered.
    20  func parseCabalFreeze(_ context.Context, _ file.Resolver, _ *generic.Environment, reader file.LocationReadCloser) ([]pkg.Package, []artifact.Relationship, error) {
    21  	r := bufio.NewReader(reader)
    22  	var pkgs []pkg.Package
    23  	for {
    24  		line, err := r.ReadString('\n')
    25  		switch {
    26  		case errors.Is(io.EOF, err):
    27  			return pkgs, nil, nil
    28  		case err != nil:
    29  			return nil, nil, fmt.Errorf("failed to parse cabal.project.freeze file: %w", err)
    30  		}
    31  
    32  		if !strings.Contains(line, "any.") {
    33  			continue
    34  		}
    35  
    36  		line = strings.TrimSpace(line)
    37  		startPkgEncoding, endPkgEncoding := strings.Index(line, "any.")+4, strings.Index(line, ",")
    38  		// case where comma not found for last package in constraint list
    39  		if endPkgEncoding == -1 {
    40  			endPkgEncoding = len(line)
    41  		}
    42  		if startPkgEncoding >= endPkgEncoding || startPkgEncoding < 0 {
    43  			continue
    44  		}
    45  
    46  		line = line[startPkgEncoding:endPkgEncoding]
    47  		fields := strings.Split(line, " ==")
    48  
    49  		pkgName, pkgVersion := fields[0], fields[1]
    50  		pkgs = append(
    51  			pkgs,
    52  			newPackage(
    53  				pkgName,
    54  				pkgVersion,
    55  				nil,
    56  				reader.Location,
    57  			),
    58  		)
    59  	}
    60  }