github.com/nextlinux/gosbom@v0.81.1-0.20230627115839-1ff50c281391/gosbom/pkg/cataloger/rust/parse_cargo_lock.go (about) 1 package rust 2 3 import ( 4 "fmt" 5 6 "github.com/nextlinux/gosbom/gosbom/artifact" 7 "github.com/nextlinux/gosbom/gosbom/file" 8 "github.com/nextlinux/gosbom/gosbom/pkg" 9 "github.com/nextlinux/gosbom/gosbom/pkg/cataloger/generic" 10 "github.com/pelletier/go-toml" 11 ) 12 13 var _ generic.Parser = parseCargoLock 14 15 type cargoLockFile struct { 16 Packages []pkg.CargoPackageMetadata `toml:"package"` 17 } 18 19 // parseCargoLock is a parser function for Cargo.lock contents, returning all rust cargo crates discovered. 20 func parseCargoLock(_ file.Resolver, _ *generic.Environment, reader file.LocationReadCloser) ([]pkg.Package, []artifact.Relationship, error) { 21 tree, err := toml.LoadReader(reader) 22 if err != nil { 23 return nil, nil, fmt.Errorf("unable to load Cargo.lock for parsing: %w", err) 24 } 25 26 m := cargoLockFile{} 27 err = tree.Unmarshal(&m) 28 if err != nil { 29 return nil, nil, fmt.Errorf("unable to parse Cargo.lock: %w", err) 30 } 31 32 var pkgs []pkg.Package 33 34 for _, p := range m.Packages { 35 if p.Dependencies == nil { 36 p.Dependencies = make([]string, 0) 37 } 38 pkgs = append( 39 pkgs, 40 newPackageFromCargoMetadata( 41 p, 42 reader.Location.WithAnnotation(pkg.EvidenceAnnotationKey, pkg.PrimaryEvidenceAnnotation), 43 ), 44 ) 45 } 46 47 return pkgs, nil, nil 48 }