github.com/alkemics/goflow@v0.2.1/wrappers/constants/loader.go (about) 1 package constants 2 3 import ( 4 "fmt" 5 "go/ast" 6 7 "golang.org/x/tools/go/packages" 8 9 "github.com/alkemics/goflow" 10 "github.com/alkemics/goflow/gfutil/gfgo" 11 ) 12 13 func loadConstants(constantPackages []string) ([]constant, error) { 14 pkgs, err := packages.Load(&packages.Config{ 15 Mode: packages.NeedName | packages.NeedTypes | packages.NeedTypesInfo, 16 }, constantPackages...) 17 if err != nil { 18 return nil, err 19 } 20 21 errs := make([]error, 0) 22 constants := make([]constant, 0) 23 for _, pkg := range pkgs { 24 if len(pkg.Errors) > 0 { 25 errs = append(errs, craftPkgError(pkg.PkgPath, pkg.Errors)) 26 } 27 28 if pkg.TypesInfo == nil { 29 continue 30 } 31 32 for k, v := range pkg.TypesInfo.Defs { 33 if v == nil || k.Obj == nil { 34 continue 35 } 36 37 // We are only interested in exported variables/constants. 38 if !ast.IsExported(k.Name) || k.Obj.Kind != ast.Con && k.Obj.Kind != ast.Var { 39 continue 40 } 41 42 typ, _, err := gfgo.ParseType(v.Type()) 43 if err != nil { 44 return nil, TypeError{ 45 Name: k.Name, 46 Err: err, 47 } 48 } 49 constants = append(constants, constant{ 50 name: fmt.Sprintf("%s.%s", pkg.Name, k.Name), 51 typ: typ, 52 imp: goflow.Import{ 53 Pkg: pkg.Name, 54 Dir: pkg.PkgPath, 55 }, 56 }) 57 } 58 } 59 60 if len(errs) > 0 { 61 err = goflow.MultiError{Errs: errs} 62 } 63 64 return constants, err 65 }