glp/parsers/golang/parser.go

68 lines
1.4 KiB
Go

package golang
import (
// stdlib
"sync"
// local
"go.dev.pztrn.name/glp/structs"
)
const (
// Package managers names. Used in Detect() for flavor returning.
packageManagerGoMod = "go mod"
packageManagerDep = "dep"
)
// This structure responsible for parsing projects that written in Go.
type golangParser struct{}
// Detect detects if passed project path can be parsed with this parser
// and additionally detect package manager used.
func (gp *golangParser) Detect(pkgPath string) (bool, string) {
// Go projects usually using go modules or dep for dependencies
// management.
isModules := gp.detectModulesUsage(pkgPath)
if isModules {
return true, packageManagerGoMod
}
isDep := gp.detectDepUsage(pkgPath)
if isDep {
return true, packageManagerDep
}
return false, ""
}
// GetDependencies extracts dependencies from project.
func (gp *golangParser) GetDependencies(flavor string, pkgPath string) []*structs.Dependency {
var deps []*structs.Dependency
switch flavor {
case packageManagerDep:
deps = gp.getDependenciesFromDep(pkgPath)
}
// Return early if no dependencies was found.
if len(deps) == 0 {
return nil
}
// For every dependency we should get additional data - go-import
// and go-source. Asynchronously.
var wg sync.WaitGroup
for _, dep := range deps {
wg.Add(1)
go func(dep *structs.Dependency) {
getGoData(dep)
wg.Done()
}(dep)
}
wg.Wait()
return deps
}