-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathanalyze.go
136 lines (107 loc) · 2.48 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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
package k6deps
import (
"encoding/json"
"os"
)
// 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 !opts.Archive.IsEmpty() {
return archiveAnalizer(opts.Archive)()
}
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 archiveAnalizer(src Source) analyzer {
return func() (Dependencies, error) {
input := src.Reader
if input == nil {
tar, err := os.Open(src.Name) //nolint:forbidigo
if err != nil {
return nil, err
}
defer tar.Close() //nolint:errcheck
input = tar
}
analyzer, err := processArchive(input)
if err != nil {
return nil, err
}
return analyzer()
}
}
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
}
}