diff --git a/cmd/llpyg/llpyg.go b/cmd/llpyg/llpyg.go index 900b74e..7d3b826 100644 --- a/cmd/llpyg/llpyg.go +++ b/cmd/llpyg/llpyg.go @@ -55,13 +55,22 @@ func main() { } // init work dir - initWorkDir(&args, cfg) + if err := initWorkDir(&args, cfg); err != nil { + log.Fatal(err) + } // LLGo Bindings generation generateFromConfig(cfg, args.OutputDir) // tidy go module - goModTidy(args.OutputDir) + if err := goModTidy(args.OutputDir); err != nil { + log.Fatal(err) + } + + // format go code + if err := codeFormat(args.OutputDir); err != nil { + log.Fatal(err) + } fmt.Printf("LLGo bindings generated successfully in %s\n", args.OutputDir) } @@ -141,23 +150,21 @@ func readConfig(cfgPath string) (cfg Config) { } // init work dir, include go module, llpyg.cfg -func initWorkDir(args *Args, cfg Config) { +func initWorkDir(args *Args, cfg Config) error { args.OutputDir = filepath.Join(args.OutputDir, cfg.Name) // remove origin output dir if err := os.RemoveAll(args.OutputDir); err != nil { - log.Fatalf("error: failed to remove output directory %s: %v\n", args.OutputDir, err) + return fmt.Errorf("failed to remove output directory %s: %v", args.OutputDir, err) } // write config file if err := writeConfig(cfg, args.OutputDir); err != nil { - log.Fatalf("error: failed to write config file %s: %v\n", args.OutputDir, err) + return fmt.Errorf("failed to write config file %s: %v", args.OutputDir, err) } // init go module if args.ModName == "" { args.ModName = cfg.Name } - if err := initGoModule(args.ModName, args.OutputDir); err != nil { - log.Fatal(err) - } + return initGoModule(args.ModName, args.OutputDir) } func generateFromConfig(cfg Config, outDir string) { diff --git a/cmd/llpyg/llpyg_test.go b/cmd/llpyg/llpyg_test.go index 19a5d6f..a39634d 100644 --- a/cmd/llpyg/llpyg_test.go +++ b/cmd/llpyg/llpyg_test.go @@ -106,3 +106,47 @@ func assertArgsEqual(t *testing.T, got, want Args) { t.Errorf("unexpected Kwarg: got %q, want %q", got.Kwarg, want.Kwarg) } } + + +func TestGoModuleUtils(t *testing.T) { + tempDir := t.TempDir() + args := Args{ + OutputDir: tempDir, + ModName: "test", + ModDepth: 1, + Kwarg: "test", + } + cfg := Config{ + Name: "test", + LibName: "test", + Modules: []string{"test"}, + } + if err := initWorkDir(&args, cfg); err != nil { + t.Fatal(err) + } + goFile := filepath.Join(args.OutputDir, "test.go") + goContent := `package main + + import ( + "fmt" + "github.com/goplus/lib/py" + ) + + func main() { + a := py.Object{} + fmt.Printf("hello %v", a) + } + ` + err := os.WriteFile(goFile, []byte(goContent), 0644) + if err != nil { + t.Fatalf("Failed to create test Go file: %v", err) + } + err = goModTidy(args.OutputDir) + if err != nil { + t.Fatal(err) + } + err = codeFormat(args.OutputDir) + if err != nil { + t.Fatal(err) + } +} diff --git a/cmd/llpyg/utils.go b/cmd/llpyg/utils.go index a26ca2a..7d9931b 100644 --- a/cmd/llpyg/utils.go +++ b/cmd/llpyg/utils.go @@ -32,36 +32,43 @@ func writeConfig(cfg Config, outDir string) error { } func initGoModule(modName string, outDir string) error { - if err := os.Chdir(outDir); err != nil { - return fmt.Errorf("error: failed to change directory: %w", err) - } // init go module cmd := exec.Command("go", "mod", "init", modName) + cmd.Dir = outDir cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr if err := cmd.Run(); err != nil { return fmt.Errorf("error: failed to initialize Go module: %w", err) } - getCmd := exec.Command("go", "get", "github.com/goplus/lib/py") - getCmd.Stdout = os.Stdout - getCmd.Stderr = os.Stderr - if err := getCmd.Run(); err != nil { + cmd = exec.Command("go", "get", "github.com/goplus/lib/py") + cmd.Dir = outDir + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + if err := cmd.Run(); err != nil { return fmt.Errorf("error: failed to get github.com/goplus/lib/py: %w", err) } return nil } func goModTidy(outDir string) error { - if err := os.Chdir(outDir); err != nil { - return fmt.Errorf("error: failed to change directory: %w", err) - } - tidyCmd := exec.Command("go", "mod", "tidy") - tidyCmd.Stdout = os.Stdout - tidyCmd.Stderr = os.Stderr - if err := tidyCmd.Run(); err != nil { + cmd := exec.Command("go", "mod", "tidy") + cmd.Dir = outDir + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + if err := cmd.Run(); err != nil { return fmt.Errorf("error: failed to tidy Go module: %w", err) } return nil } +func codeFormat(outDir string) error { + cmd := exec.Command("go", "fmt", "./...") + cmd.Dir = outDir + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + if err := cmd.Run(); err != nil { + return fmt.Errorf("error: failed to format Go code: %w", err) + } + return nil +}