137 lines
3.8 KiB
Go
137 lines
3.8 KiB
Go
package cmd
|
|
|
|
import (
|
|
"complie-erlang/config"
|
|
"complie-erlang/parser/zm_lib"
|
|
"complie-erlang/worker"
|
|
"fmt"
|
|
"github.com/spf13/cobra"
|
|
"log"
|
|
"os"
|
|
"path/filepath"
|
|
)
|
|
|
|
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 {
|
|
fmt.Println("参数打印: ")
|
|
_ = zm_lib.PrintArgsMap(args)
|
|
fmt.Println("")
|
|
}
|
|
|
|
_, err = os.Stat(s.out)
|
|
if err != nil && !os.IsNotExist(err) {
|
|
log.Printf("Err 文件错误: %v", err)
|
|
return
|
|
}
|
|
if err == nil {
|
|
abs1, _ := filepath.Abs(s.out)
|
|
fmt.Printf("[warn] 原文件已存在 > %s:1\n", abs1)
|
|
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("模板输出:\n", template)
|
|
return
|
|
}
|
|
|
|
if err := os.WriteFile(s.out, []byte(template), 0644); err != nil {
|
|
log.Printf("Err 写入文件失败: %v", err)
|
|
return
|
|
}
|
|
|
|
abs, _ := filepath.Abs(s.out)
|
|
fmt.Printf(" \n生成文件\n > %s:0\n", abs)
|
|
}
|
|
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 {
|
|
outPut, _ := globalCache.GetDefault(fmt.Sprintf("%s.out", logsCmd.Use), "%s_port.erl")
|
|
out = fmt.Sprintf(outPut.(string), filepath.Base(currentDir))
|
|
|
|
plugin, _ := globalCache.GetDefault(fmt.Sprintf("%s.Plugin", logsCmd.Use), "plugin")
|
|
pluginPathByWd, err := zm_lib.GetPluginPathByWd(plugin.(string))
|
|
if err == nil {
|
|
defaultProtoPath, _ := globalCache.GetDefault(fmt.Sprintf("%s.Proto", logsCmd.Use), "\\gpb\\game\\pro_%s.proto")
|
|
protoPath = filepath.Join(pluginPathByWd, fmt.Sprintf(defaultProtoPath.(string), filepath.Base(currentDir)))
|
|
}
|
|
}
|
|
|
|
logsCmd.PersistentFlags().BoolVar(&singleSet.debug, "debug", false, "是否启动调试模式")
|
|
logsCmd.PersistentFlags().StringVar(&singleSet.protoPath, "proto", protoPath, "读取文件")
|
|
logsCmd.PersistentFlags().StringVar(&singleSet.out, "out", out, "输出文件")
|
|
_ = zm_lib.PersistentFlagsStringVar(logsCmd, &singleSet.author, globalCache, "author", "st,sutong@youkia.net", "作者")
|
|
_ = zm_lib.PersistentFlagsStringVar(logsCmd, &singleSet.mainTemplate, globalCache, "main_tpl", "ErlangPort", "主模版")
|
|
_ = zm_lib.PersistentFlagsStringVar(logsCmd, &singleSet.tplDir, globalCache, "tpl", "./templates/*.tpl", "模版地址")
|
|
//logsCmd.PersistentFlags().StringVar(&singleSet.mainTemplate, "main_tpl", "ErlangPort", "主模版")
|
|
//logsCmd.PersistentFlags().StringVar(&singleSet.tplDir, "tpl", "./templates/*.tpl", "模版地址")
|
|
|
|
rootCmd.AddCommand(logsCmd)
|
|
}
|