Files
complie-erlang/cmd/pb2port.go
T

128 lines
3.1 KiB
Go

package cmd
import (
"complie-erlang/config"
"complie-erlang/worker"
"fmt"
"github.com/spf13/cobra"
"log"
"os"
"path/filepath"
"strings"
)
type Pb2Port struct {
debug bool
protoPath string // proto 文件
out string // 输出文件
tplDir string // 模版目录
author string // 作者
mainTemplate string // 默认模版
}
func (s *Pb2Port) run(_ *cobra.Command, arg []string) {
if len(arg) == 0 {
log.Println("请输入功能名称")
return
}
worker1 := worker.NewProto2ErlangWorker()
// 获取可执行文件所在目录
exePath, err := os.Executable()
if err != nil {
log.Fatalf("获取可执行文件路径失败: %v", err)
return
}
if err := worker1.LoadTemplates(filepath.Join(filepath.Dir(exePath), s.tplDir)); err != nil {
log.Printf("Err 加载模版报错: %v", err)
return
}
defaultArgs := []config.DefaultArg{
{
Key: "Author",
Value: s.author,
},
}
args, err := worker1.LoadTemplatesArgs(s.protoPath, defaultArgs)
if err != nil {
log.Printf("Err 读取配置文件失败: %v path: %s", err, s.protoPath)
return
}
args["Module"] = filepath.Base(s.out)[:len(filepath.Base(s.out))-len(filepath.Ext(s.out))]
arg = append(arg, "port")
args["Desc"] = arg
template, err := worker1.ExecuteTemplate(s.mainTemplate, args)
if err != nil {
log.Printf("Err 模版生成出错: %v", err)
return
}
if s.debug {
for key, arg1 := range args {
fmt.Println(key, "-->", arg1)
}
}
_, err = os.Stat(s.out)
if err != nil && !os.IsNotExist(err) {
log.Printf("Err 文件错误: %v", err)
return
}
if err == nil {
s.out = filepath.Base(s.out)[:len(filepath.Base(s.out))-len(filepath.Ext(s.out))]
s.out = s.out + "_gen.erl"
}
if s.debug {
fmt.Println("template:", template)
return
}
if err := os.WriteFile(s.out, []byte(template), 0644); err != nil {
log.Printf("Err 写入文件失败: %v", err)
return
}
fmt.Println("ok")
}
func init() {
var singleSet = new(Pb2Port)
var logsCmd = &cobra.Command{
Use: "init",
Short: "根据proto 文件构建 功能模版",
Long: `构建功能数据`,
Run: singleSet.run,
}
var (
out = ""
protoPath = ""
)
// 写入默认数据
if currentDir, err := os.Getwd(); err == nil {
out = fmt.Sprintf("%s_port.erl", filepath.Base(currentDir))
pluginSpilt := strings.Split(currentDir, "plugin")
if len(pluginSpilt) > 0 {
pluginSpilt = pluginSpilt[:len(pluginSpilt)-1]
protoPath = filepath.Join(strings.Join(pluginSpilt, "plugin"), fmt.Sprintf("\\gpb\\game\\pro_%s.proto", filepath.Base(currentDir)))
}
}
logsCmd.PersistentFlags().BoolVar(&singleSet.debug, "debug", false, "是否启动调试模式")
logsCmd.PersistentFlags().StringVar(&singleSet.protoPath, "proto", protoPath, "读取文件")
logsCmd.PersistentFlags().StringVar(&singleSet.out, "out", out, "输出文件")
logsCmd.PersistentFlags().StringVar(&singleSet.author, "author", "st,sutong@youkia.net", "作者")
logsCmd.PersistentFlags().StringVar(&singleSet.mainTemplate, "main_tpl", "ErlangPort", "主模版")
logsCmd.PersistentFlags().StringVar(&singleSet.tplDir, "tpl", "./templates/*.tpl", "模版地址")
rootCmd.AddCommand(logsCmd)
}