github.com/nextlinux/gosbom@v0.81.1-0.20230627115839-1ff50c281391/gosbom/pkg/cataloger/cpp/parse_conanfile.go (about) 1 package cpp 2 3 import ( 4 "bufio" 5 "errors" 6 "fmt" 7 "io" 8 "strings" 9 10 "github.com/nextlinux/gosbom/gosbom/artifact" 11 "github.com/nextlinux/gosbom/gosbom/file" 12 "github.com/nextlinux/gosbom/gosbom/pkg" 13 "github.com/nextlinux/gosbom/gosbom/pkg/cataloger/generic" 14 ) 15 16 var _ generic.Parser = parseConanfile 17 18 type Conanfile struct { 19 Requires []string `toml:"requires"` 20 } 21 22 // parseConanfile is a parser function for conanfile.txt contents, returning all packages discovered. 23 func parseConanfile(_ file.Resolver, _ *generic.Environment, reader file.LocationReadCloser) ([]pkg.Package, []artifact.Relationship, error) { 24 r := bufio.NewReader(reader) 25 inRequirements := false 26 var pkgs []pkg.Package 27 for { 28 line, err := r.ReadString('\n') 29 switch { 30 case errors.Is(io.EOF, err): 31 return pkgs, nil, nil 32 case err != nil: 33 return nil, nil, fmt.Errorf("failed to parse conanfile.txt file: %w", err) 34 } 35 36 switch { 37 case strings.Contains(line, "[requires]"): 38 inRequirements = true 39 case strings.ContainsAny(line, "[]#"): 40 inRequirements = false 41 } 42 43 m := pkg.ConanMetadata{ 44 Ref: strings.Trim(line, "\n"), 45 } 46 47 if !inRequirements { 48 continue 49 } 50 51 p := newConanfilePackage( 52 m, 53 reader.Location.WithAnnotation(pkg.EvidenceAnnotationKey, pkg.PrimaryEvidenceAnnotation), 54 ) 55 if p == nil { 56 continue 57 } 58 59 pkgs = append(pkgs, *p) 60 } 61 }