-
Notifications
You must be signed in to change notification settings - Fork 15
/
package_json.go
62 lines (53 loc) · 1.3 KB
/
package_json.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package oss
import (
"bytes"
"encoding/json"
"fmt"
"github.com/aquasecurity/go-git-pr-commenter/pkg/commenter"
"github.com/samber/lo"
)
type PackageJson struct {
Dependencies Dependencies `json:"dependencies,omitempty"`
}
type Dependencies map[string]Dependency
type Dependency struct {
Name string
Version string
Line int32
Path string
}
func (pj *PackageJson) UnmarshalJSON(data []byte) error {
var m map[string]interface{}
if err := json.Unmarshal(data, &m); err != nil {
return err
}
lineSep := []byte{'\n'}
// Unmarshal dependencies
if deps, ok := m["dependencies"]; ok {
if deps, ok := deps.(map[string]interface{}); ok {
pj.Dependencies = make(Dependencies)
for name, ver := range deps {
if ver, ok := ver.(string); ok {
nameIndex := bytes.Index(data, []byte(fmt.Sprintf(`"%s":`, name)))
line := int32(0)
if nameIndex != -1 {
line = int32(bytes.Count(data[:nameIndex], lineSep))
}
pj.Dependencies[name] = Dependency{
Name: name,
Version: ver,
Line: lo.Ternary(line == 0, int32(commenter.FIRST_AVAILABLE_LINE), line+1),
}
}
}
}
}
return nil
}
func (ds Dependencies) MarshalJSON() ([]byte, error) {
m := make(map[string]string, len(ds))
for k, v := range ds {
m[k] = v.Version
}
return json.Marshal(m)
}