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