-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathanalyze.go
107 lines (83 loc) · 2.02 KB
/
analyze.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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
package k6deps
import "encoding/json"
// Analyze searches, loads and analyzes the specified sources,
// extracting the k6 extensions and their version constraints.
// Note: if archive is specified, the other three sources will not be taken into account,
// since the archive may contain them.
func Analyze(opts *Options) (Dependencies, error) {
if err := loadSources(opts); err != nil {
return nil, err
}
return mergeAnalyzers(
scriptAnalyzer(opts.Script),
manifestAnalyzer(opts.Manifest),
envAnalyzer(opts.Env),
)()
}
type analyzer func() (Dependencies, error)
func empty() (Dependencies, error) {
return make(Dependencies), nil
}
func filterInvalid(from Dependencies) Dependencies {
deps := make(Dependencies)
for name, dep := range from {
if reName.MatchString(name) {
deps[name] = dep
}
}
return deps
}
func manifestAnalyzer(src Source) analyzer {
if len(src.Contents) == 0 {
return empty
}
return func() (Dependencies, error) {
var manifest struct {
Dependencies Dependencies `json:"dependencies,omitempty"`
}
if err := json.Unmarshal(src.Contents, &manifest); err != nil {
return nil, err
}
return filterInvalid(manifest.Dependencies), nil
}
}
func scriptAnalyzer(src Source) analyzer {
if len(src.Contents) == 0 {
return empty
}
return func() (Dependencies, error) {
var deps Dependencies
if err := (&deps).UnmarshalJS(src.Contents); err != nil {
return nil, err
}
return deps, nil
}
}
func envAnalyzer(src Source) analyzer {
if len(src.Contents) == 0 {
return empty
}
return func() (Dependencies, error) {
var deps Dependencies
if err := (&deps).UnmarshalText(src.Contents); err != nil {
return nil, err
}
return filterInvalid(deps), nil
}
}
func mergeAnalyzers(sources ...analyzer) analyzer {
return func() (Dependencies, error) {
deps := make(Dependencies)
for _, src := range sources {
dep, err := src()
if err != nil {
return nil, err
}
err = deps.Merge(dep)
if err != nil {
return nil, err
}
}
return deps, nil
}
}