135 lines
3.3 KiB
Go
135 lines
3.3 KiB
Go
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
|
|
}
|