MCPcopy Create free account
hub / github.com/XmirrorSecurity/OpenSCA-cli / ParseCargoLock

Function ParseCargoLock

opensca/sca/rust/cargo.go:14–65  ·  view source on GitHub ↗

ParseCargoLock 解析Cargo.lock文件

(file *model.File)

Source from the content-addressed store, hash-verified

12
13// ParseCargoLock 解析Cargo.lock文件
14func ParseCargoLock(file *model.File) *model.DepGraph {
15
16 cargo := struct {
17 Pkgs []struct {
18 Name string `toml:"name"`
19 Version string `toml:"version"`
20 Dependencies []string `toml:"dependencies"`
21 } `toml:"package"`
22 }{}
23
24 file.OpenReader(func(reader io.Reader) {
25 _, err := toml.NewDecoder(reader).Decode(&cargo)
26 if err != nil {
27 logs.Warnf("parse %s fail:%s", file.Relpath(), err)
28 }
29 })
30
31 // 记录组件信息
32 depMap := map[string]*model.DepGraph{}
33 _dep := model.NewDepGraphMap(nil, func(s ...string) *model.DepGraph {
34 return &model.DepGraph{
35 Name: s[0],
36 Version: s[1],
37 }
38 }).LoadOrStore
39 for _, c := range cargo.Pkgs {
40 depMap[c.Name] = _dep(c.Name, c.Version)
41 }
42
43 // 记录依赖关系
44 for _, c := range cargo.Pkgs {
45 dep := _dep(c.Name, c.Version)
46 for _, dependency := range c.Dependencies {
47 i := strings.Index(dependency, " ")
48 if i != -1 {
49 name, version := dependency[:i], dependency[i+1:]
50 dep.AppendChild(_dep(name, version))
51 } else {
52 dep.AppendChild(depMap[dependency])
53 }
54 }
55 }
56
57 root := &model.DepGraph{Path: file.Relpath()}
58 for _, dep := range depMap {
59 if len(dep.Parents) == 0 {
60 root.AppendChild(dep)
61 }
62 }
63
64 return root
65}

Callers 1

ScaMethod · 0.85

Calls 7

AppendChildMethod · 0.95
WarnfFunction · 0.92
NewDepGraphMapFunction · 0.92
OpenReaderMethod · 0.80
DecodeMethod · 0.80
RelpathMethod · 0.80
IndexMethod · 0.80

Tested by

no test coverage detected