+
+func listImports(genfile *GenFile) map[string]string {
+ var importPath = genfile.ImportPrefix
+ if importPath == "" {
+ importPath = resolveImportPath(genfile.outputDir)
+ logrus.Debugf("resolved import path: %s", importPath)
+ }
+ imports := map[string]string{}
+ for _, imp := range genfile.file.imports {
+ if _, ok := imports[imp]; !ok {
+ imports[imp] = path.Join(importPath, imp)
+ }
+ }
+ return imports
+}
+
+func resolveImportPath(outputDir string) string {
+ absPath, err := filepath.Abs(outputDir)
+ if err != nil {
+ panic(err)
+ }
+ modRoot := findModuleRoot(absPath)
+ if modRoot == "" {
+ logrus.Fatalf("module root not found at: %s", absPath)
+ }
+ modPath := findModulePath(path.Join(modRoot, "go.mod"))
+ if modPath == "" {
+ logrus.Fatalf("module path not found")
+ }
+ relDir, err := filepath.Rel(modRoot, absPath)
+ if err != nil {
+ panic(err)
+ }
+ return filepath.Join(modPath, relDir)
+}
+
+func findModuleRoot(dir string) (root string) {
+ if dir == "" {
+ panic("dir not set")
+ }
+ dir = filepath.Clean(dir)
+
+ // Look for enclosing go.mod.
+ for {
+ if fi, err := os.Stat(filepath.Join(dir, "go.mod")); err == nil && !fi.IsDir() {
+ return dir
+ }
+ d := filepath.Dir(dir)
+ if d == dir {
+ break
+ }
+ dir = d
+ }
+ return ""
+}
+
+var (
+ modulePathRE = regexp.MustCompile(`module[ \t]+([^ \t\r\n]+)`)
+)
+
+func findModulePath(file string) string {
+ data, err := ioutil.ReadFile(file)
+ if err != nil {
+ return ""
+ }
+ m := modulePathRE.FindSubmatch(data)
+ if m == nil {
+ return ""
+ }
+ return string(m[1])
+}