mod.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. // Copyright 2025 BackendServerTemplate Authors. All rights reserved.
  2. // Use of this source code is governed by a MIT-style
  3. // license that can be found in the LICENSE file.
  4. package mod
  5. import (
  6. "fmt"
  7. "github.com/SongZihuan/BackendServerTemplate/tool/utils/cleanstringutils"
  8. "log"
  9. "os"
  10. "regexp"
  11. "strings"
  12. "sync"
  13. )
  14. const FileGoMod = "./go.mod"
  15. const module = "module"
  16. var validModuleNameRegex = regexp.MustCompile(`^[a-zA-Z0-9]+([./-]?[a-zA-Z0-9]+)*$`)
  17. var once sync.Once
  18. var goModuleName string = ""
  19. func GetGoModuleName() (string, error) {
  20. var err error
  21. once.Do(func() {
  22. goModuleName, err = getGoModuleName()
  23. })
  24. if goModuleName == "" && err == nil {
  25. err = fmt.Errorf("go module name not found")
  26. }
  27. return goModuleName, err
  28. }
  29. func getGoModuleName() (string, error) {
  30. log.Println("generate: find the go mod name")
  31. defer log.Println("generate: find the go mod name finish")
  32. dat, err := os.ReadFile(FileGoMod)
  33. if err != nil {
  34. return "", err
  35. }
  36. goMod := strings.TrimPrefix(cleanstringutils.GetString(string(dat)), "\n")
  37. moduleLine := strings.TrimSpace(strings.Split(goMod, "\n")[0])
  38. if !strings.Contains(moduleLine, module) && len(moduleLine) > len(module) {
  39. return "", fmt.Errorf("go.mod error: %s not found", module)
  40. }
  41. moduleName := cleanstringutils.GetStringOneLine(moduleLine[len(module):])
  42. if !IsValidGoModuleName(moduleName) {
  43. return "", fmt.Errorf("go.mod error: '%s' is not a valid go module name", moduleName)
  44. }
  45. log.Printf("generate: go mod name get: %s\n", moduleName)
  46. return moduleName, nil
  47. }
  48. func IsValidGoModuleName(name string) bool {
  49. return validModuleNameRegex.MatchString(name)
  50. }