// Copyright 2025 BackendServerTemplate Authors. All rights reserved. // Use of this source code is governed by a MIT-style // license that can be found in the LICENSE file. package mod import ( "fmt" "github.com/SongZihuan/BackendServerTemplate/tool/utils/cleanstringutils" "log" "os" "regexp" "strings" "sync" ) const FileGoMod = "./go.mod" const module = "module" var validModuleNameRegex = regexp.MustCompile(`^[a-zA-Z0-9]+([./-]?[a-zA-Z0-9]+)*$`) var once sync.Once var goModuleName string = "" func GetGoModuleName() (string, error) { var err error once.Do(func() { goModuleName, err = getGoModuleName() }) if goModuleName == "" && err == nil { err = fmt.Errorf("go module name not found") } return goModuleName, err } func getGoModuleName() (string, error) { log.Println("generate: find the go mod name") defer log.Println("generate: find the go mod name finish") dat, err := os.ReadFile(FileGoMod) if err != nil { return "", err } goMod := strings.TrimPrefix(cleanstringutils.GetString(string(dat)), "\n") moduleLine := strings.TrimSpace(strings.Split(goMod, "\n")[0]) if !strings.Contains(moduleLine, module) && len(moduleLine) > len(module) { return "", fmt.Errorf("go.mod error: %s not found", module) } moduleName := cleanstringutils.GetStringOneLine(moduleLine[len(module):]) if !IsValidGoModuleName(moduleName) { return "", fmt.Errorf("go.mod error: '%s' is not a valid go module name", moduleName) } log.Printf("generate: go mod name get: %s\n", moduleName) return moduleName, nil } func IsValidGoModuleName(name string) bool { return validModuleNameRegex.MatchString(name) }