Files
complie-erlang/worker/single_file.go
T
2025-09-25 13:48:00 +08:00

144 lines
3.5 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) {
// 判断是否是绝对路径若是则直接返回
if filepath.IsAbs(cfgFile) {
return cfgFile, nil
}
// 获取可执行文件所在目录
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
}