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  }