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 }