Recognize stat_dir_type_empty
[govpp.git] / binapigen / run.go
index 88e32b7..d632519 100644 (file)
@@ -29,9 +29,10 @@ import (
 )
 
 type Options struct {
-       OutputDir     string // output directory for generated files
-       ImportPrefix  string // prefix for import paths
-       NoVersionInfo bool   // disables generating version info
+       OutputDir        string // output directory for generated files
+       ImportPrefix     string // prefix for import paths
+       NoVersionInfo    bool   // disables generating version info
+       NoSourcePathInfo bool   // disables the 'source: /path' comment
 }
 
 func Run(apiDir string, filesToGenerate []string, opts Options, f func(*Generator) error) {
@@ -42,17 +43,20 @@ func Run(apiDir string, filesToGenerate []string, opts Options, f func(*Generato
 }
 
 func run(apiDir string, filesToGenerate []string, opts Options, fn func(*Generator) error) error {
-       apifiles, err := vppapi.ParseDir(apiDir)
+       apiFiles, err := vppapi.ParseDir(apiDir)
        if err != nil {
                return err
        }
 
        if opts.ImportPrefix == "" {
-               opts.ImportPrefix = resolveImportPath(opts.OutputDir)
-               logrus.Debugf("resolved import prefix: %s", opts.ImportPrefix)
+               opts.ImportPrefix, err = resolveImportPath(opts.OutputDir)
+               if err != nil {
+                       return fmt.Errorf("cannot resolve import path for output dir %s: %w", opts.OutputDir, err)
+               }
+               logrus.Debugf("resolved import path prefix: %s", opts.ImportPrefix)
        }
 
-       gen, err := New(opts, apifiles, filesToGenerate)
+       gen, err := New(opts, apiFiles, filesToGenerate)
        if err != nil {
                return err
        }
@@ -69,7 +73,6 @@ func run(apiDir string, filesToGenerate []string, opts Options, fn func(*Generat
                        return err
                }
        }
-
        if err = gen.Generate(); err != nil {
                return err
        }
@@ -93,10 +96,6 @@ func init() {
        if debug := os.Getenv("DEBUG_GOVPP"); strings.Contains(debug, "binapigen") {
                Logger.SetLevel(logrus.DebugLevel)
                logrus.SetLevel(logrus.DebugLevel)
-       } else if debug != "" {
-               Logger.SetLevel(logrus.InfoLevel)
-       } else {
-               Logger.SetLevel(logrus.WarnLevel)
        }
 }
 
@@ -104,32 +103,30 @@ func logf(f string, v ...interface{}) {
        Logger.Debugf(f, v...)
 }
 
-func resolveImportPath(dir string) string {
+// resolveImportPath tries to resolve import path for a directory.
+func resolveImportPath(dir string) (string, error) {
        absPath, err := filepath.Abs(dir)
        if err != nil {
-               panic(err)
+               return "", err
        }
        modRoot := findGoModuleRoot(absPath)
        if modRoot == "" {
-               logrus.Fatalf("module root not found at: %s", absPath)
+               return "", err
        }
-       modPath := findModulePath(path.Join(modRoot, "go.mod"))
-       if modPath == "" {
-               logrus.Fatalf("module path not found")
+       modPath, err := readModulePath(path.Join(modRoot, "go.mod"))
+       if err != nil {
+               return "", err
        }
        relDir, err := filepath.Rel(modRoot, absPath)
        if err != nil {
-               panic(err)
+               return "", err
        }
-       return filepath.Join(modPath, relDir)
+       return filepath.Join(modPath, relDir), nil
 }
 
+// findGoModuleRoot looks for enclosing Go module.
 func findGoModuleRoot(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
@@ -143,18 +140,17 @@ func findGoModuleRoot(dir string) (root string) {
        return ""
 }
 
-var (
-       modulePathRE = regexp.MustCompile(`module[ \t]+([^ \t\r\n]+)`)
-)
+var modulePathRE = regexp.MustCompile(`module[ \t]+([^ \t\r\n]+)`)
 
-func findModulePath(file string) string {
-       data, err := ioutil.ReadFile(file)
+// readModulePath reads module path from go.mod file.
+func readModulePath(gomod string) (string, error) {
+       data, err := ioutil.ReadFile(gomod)
        if err != nil {
-               return ""
+               return "", err
        }
        m := modulePathRE.FindSubmatch(data)
        if m == nil {
-               return ""
+               return "", err
        }
-       return string(m[1])
+       return string(m[1]), nil
 }