package worker import ( "bufio" "complie-erlang/config" "complie-erlang/parser" "complie-erlang/template" "fmt" "os" "path/filepath" "strings" ) type SingleFile struct { templater *template.Template } func NewSingleFile(templater *template.Template) *SingleFile { return &SingleFile{ templater: templater, } } func (s *SingleFile) ParseTemKey(filename string, Keyword config.ErlangTemKey) ([]string, error) { erlangFile, err := parser.ParseErlangFile(filename) if err != nil { return nil, err } var result []string for _, function := range erlangFile.Functions { if len(function.KeyMap[Keyword.Name]) == 0 { continue } var argsMap = map[string]any{ "module": []string{erlangFile.ModuleName}, "func": []string{function.Name}, } for key, arg := range function.KeyMap { if key == Keyword.Name { for key1, arg1 := range arg { argsMap[key1] = arg1 } continue } if len(arg) == 0 { arg["is"] = []string{"1"} argsMap[key] = arg continue } argsMap[key] = arg } for _, cfgPublicArg := range Keyword.DefaultArgs { argsMap[cfgPublicArg.Key] = cfgPublicArg.Value } executeTemplate, err := s.templater.ExecuteTemplate(Keyword.MainTemplate, argsMap) if err != nil { return nil, err } result = append(result, strings.TrimSpace(removeEmptyLinesUniversal(executeTemplate))) } return result, nil } func removeEmptyLinesUniversal(text string) string { var result strings.Builder scanner := bufio.NewScanner(strings.NewReader(text)) for scanner.Scan() { line := scanner.Text() if strings.TrimSpace(line) != "" { result.WriteString(line) result.WriteString("\n") } } return strings.TrimSpace(result.String()) } // FindConfigXMLPath 1. 打印当前 exe 文件夹内的 config.xml 文件的绝对路径 func (s *SingleFile) FindConfigXMLPath(cfgFile string) (string, error) { // 获取可执行文件所在目录 exePath, err := os.Executable() if err != nil { return "", fmt.Errorf("获取可执行文件路径失败: %v", err) } exeDir := filepath.Dir(exePath) configPath := filepath.Join(exeDir, cfgFile) // 检查文件是否存在 if _, err := os.Stat(configPath); err == nil { absPath, err := filepath.Abs(configPath) if err != nil { return "", fmt.Errorf("获取绝对路径失败: %v", err) } return absPath, nil } else { return "", fmt.Errorf("%s 文件不存在于: %s\n", cfgFile, exeDir) } } // FindPatternErlFiles 2. 打印当前目录下符合 "*_port.erl" 的全部文件的文件名 func (s *SingleFile) FindPatternErlFiles(patternFile string) ([]string, error) { currentDir, err := os.Getwd() if err != nil { return nil, err } pattern := filepath.Join(currentDir, patternFile) files, err := filepath.Glob(pattern) if err != nil { return nil, err } return files, nil } // FindPluginCfgFiles 3. 打印当前目录的绝对路径中最近的 plugin 文件夹下第一级与当前目录同名的文件夹中的 .cfg 文件的绝对路径 func (s *SingleFile) FindPluginCfgFiles(sep string, dir, currentFile string) (string, error) { //sep := "plugin\\game" // 使用系统路径分隔符进行分割 pathParts := strings.Split(currentFile, sep) if len(pathParts) < 2 { return "", fmt.Errorf("未找到插件目录") } // 查找目标路径下的所有 .cfg 文件 pattern := filepath.Join(pathParts[0], sep, dir) return pattern, nil }