-
Notifications
You must be signed in to change notification settings - Fork 10
/
parser.go
98 lines (88 loc) · 2.33 KB
/
parser.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
package gomod
import (
"io/ioutil"
"os"
"path/filepath"
"strings"
"unicode"
log "github.com/sirupsen/logrus"
"github.com/parvez3019/go-swagger3/parser/model"
"golang.org/x/mod/modfile"
)
type Parser interface {
Parse() error
}
type parser struct {
model.Utils
}
func NewParser(utils model.Utils) Parser {
return &parser{
Utils: utils,
}
}
// Parse parse go.mod info
func (p *parser) Parse() error {
log.Info("Parsing GoMod Info ...")
b, err := ioutil.ReadFile(p.GoModFilePath)
if err != nil {
return err
}
file, err := modfile.Parse(p.GoModFilePath, b, nil)
if err != nil {
return err
}
for i := range file.Require {
if err = p.parseGoModFilePackages(file.Require[i].Mod.Path, file.Require[i].Mod.Version); err != nil {
return err
}
}
if p.RunInDebugMode {
for i := range p.KnownPkgs {
p.Debugf(p.KnownPkgs[i].Name, "->", p.KnownPkgs[i].Path)
}
}
return nil
}
func (p *parser) parseGoModFilePackages(pkgName string, version string) error {
pathRunes := []rune{}
for _, v := range pkgName {
if !unicode.IsUpper(v) {
pathRunes = append(pathRunes, v)
continue
}
pathRunes = append(pathRunes, '!')
pathRunes = append(pathRunes, unicode.ToLower(v))
}
pkgPath := filepath.Join(p.GoModCachePath, string(pathRunes)+"@"+version)
pkgName = filepath.ToSlash(pkgName)
p.KnownPkgs = append(p.KnownPkgs, model.Pkg{
Name: pkgName,
Path: pkgPath,
})
p.KnownNamePkg[pkgName] = &p.KnownPkgs[len(p.KnownPkgs)-1]
p.KnownPathPkg[pkgPath] = &p.KnownPkgs[len(p.KnownPkgs)-1]
return filepath.Walk(pkgPath, p.walkerFunc(pkgName, pkgPath))
}
func (p *parser) walkerFunc(pkgName string, pkgPath string) func(path string, info os.FileInfo, err error) error {
return func(path string, info os.FileInfo, err error) error {
if info != nil && info.IsDir() {
if strings.HasPrefix(strings.Trim(strings.TrimPrefix(path, p.ModulePath), "/"), ".git") {
return nil
}
fns, err := filepath.Glob(filepath.Join(path, "*.go"))
if len(fns) == 0 || err != nil {
return nil
}
// p.debug(path)
name := filepath.Join(pkgName, strings.TrimPrefix(path, pkgPath))
name = filepath.ToSlash(name)
p.KnownPkgs = append(p.KnownPkgs, model.Pkg{
Name: name,
Path: path,
})
p.KnownNamePkg[name] = &p.KnownPkgs[len(p.KnownPkgs)-1]
p.KnownPathPkg[path] = &p.KnownPkgs[len(p.KnownPkgs)-1]
}
return nil
}
}