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 }