-
Notifications
You must be signed in to change notification settings - Fork 354
/
extract.go
80 lines (60 loc) · 1.63 KB
/
extract.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
package lockfile
import (
"errors"
"fmt"
"sort"
"strings"
)
var extractors = map[string]Extractor{}
func registerExtractor(name string, extractor Extractor) {
if _, ok := extractors[name]; ok {
panic(fmt.Sprintf("an extractor is already registered as %s", name))
}
extractors[name] = extractor
}
func FindExtractor(path, extractAs string) (Extractor, string) {
if extractAs != "" {
return extractors[extractAs], extractAs
}
for name, extractor := range extractors {
if extractor.ShouldExtract(path) {
return extractor, name
}
}
return nil, ""
}
func ListExtractors() []string {
es := make([]string, 0, len(extractors))
for s := range extractors {
es = append(es, s)
}
sort.Slice(es, func(i, j int) bool {
return strings.ToLower(es[i]) < strings.ToLower(es[j])
})
return es
}
var ErrExtractorNotFound = errors.New("could not determine extractor")
func ExtractDeps(f DepFile, extractAs string) (Lockfile, error) {
extractor, extractedAs := FindExtractor(f.Path(), extractAs)
if extractor == nil {
if extractAs != "" {
return Lockfile{}, fmt.Errorf("%w, requested %s", ErrExtractorNotFound, extractAs)
}
return Lockfile{}, fmt.Errorf("%w for %s", ErrExtractorNotFound, f.Path())
}
packages, err := extractor.Extract(f)
if err != nil && extractAs != "" {
err = fmt.Errorf("(extracting as %s) %w", extractedAs, err)
}
sort.Slice(packages, func(i, j int) bool {
if packages[i].Name == packages[j].Name {
return packages[i].Version < packages[j].Version
}
return packages[i].Name < packages[j].Name
})
return Lockfile{
FilePath: f.Path(),
ParsedAs: extractedAs,
Packages: packages,
}, err
}