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) }