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  }