补充完成逻辑
This commit is contained in:
@@ -0,0 +1,134 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user