github.com/profzone/eden-framework@v1.0.10/internal/generator/importer/importer.go (about)

     1  package importer
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"github.com/profzone/eden-framework/pkg/packagex"
     7  	str "github.com/profzone/eden-framework/pkg/strings"
     8  	"github.com/sirupsen/logrus"
     9  	"io"
    10  	"strings"
    11  )
    12  
    13  type PackageImporter struct {
    14  	PackagePath string
    15  	pkgs        map[string]*Package
    16  }
    17  
    18  func NewPackageImporter(packagePath string) *PackageImporter {
    19  	return &PackageImporter{
    20  		PackagePath: packagePath,
    21  		pkgs:        make(map[string]*Package),
    22  	}
    23  }
    24  
    25  func (i *PackageImporter) AddImport(importPath string, p *Package) {
    26  	if _, ok := i.pkgs[importPath]; ok {
    27  		return
    28  	}
    29  	i.pkgs[importPath] = p
    30  }
    31  
    32  func (i *PackageImporter) Import(pkgNamePattern, searchPath string, useAlias bool) *Package {
    33  	pkgNamePattern = ParseVendor(pkgNamePattern)
    34  	p, ok := i.pkgs[pkgNamePattern]
    35  	if !ok {
    36  		pkg, err := packagex.LoadFrom(pkgNamePattern, searchPath)
    37  		if err != nil {
    38  			logrus.Panic(err)
    39  		}
    40  		p = &Package{
    41  			Package: pkg.Package,
    42  		}
    43  		if useAlias {
    44  			p.Alias = str.ToLowerSnakeCase(pkgNamePattern)
    45  		}
    46  		i.pkgs[pkgNamePattern] = p
    47  	}
    48  
    49  	return p
    50  }
    51  
    52  func (i *PackageImporter) Use(pkgName string, subs ...string) string {
    53  	pkgName, decl := GetPackagePathAndDecl(strings.Join(append([]string{pkgName}, subs...), "/"))
    54  	p := i.Import(pkgName, "", true)
    55  
    56  	if decl != "" {
    57  		if pkgName == i.PackagePath {
    58  			return decl
    59  		}
    60  
    61  		return fmt.Sprintf("%s.%s", p.GetSelector(), decl)
    62  	}
    63  
    64  	return p.GetSelector()
    65  }
    66  
    67  func (i *PackageImporter) UseWithoutAlias(pkgName, searchPath string, subs ...string) string {
    68  	pkgName, decl := GetPackagePathAndDecl(strings.Join(append([]string{pkgName}, subs...), "/"))
    69  	p := i.Import(pkgName, searchPath, false)
    70  
    71  	if decl != "" {
    72  		if pkgName == i.PackagePath {
    73  			return decl
    74  		}
    75  
    76  		return fmt.Sprintf("%s.%s", p.GetSelector(), decl)
    77  	}
    78  
    79  	return p.GetSelector()
    80  }
    81  
    82  func (i *PackageImporter) WriteToImports(w io.Writer) {
    83  	if len(i.pkgs) > 0 {
    84  		for _, importPkg := range i.pkgs {
    85  			io.WriteString(w, importPkg.String()+"\n")
    86  		}
    87  	}
    88  }
    89  
    90  func (i *PackageImporter) String() string {
    91  	buf := &bytes.Buffer{}
    92  	if len(i.pkgs) > 0 {
    93  		buf.WriteString("import (\n")
    94  		i.WriteToImports(buf)
    95  		buf.WriteString(")\n\n")
    96  	}
    97  	return buf.String()
    98  }
    99  
   100  func (i *PackageImporter) Merge(target *PackageImporter) {
   101  	for importPath, pkg := range target.pkgs {
   102  		i.AddImport(importPath, pkg)
   103  	}
   104  }