From a56a20263af2e0f72fd5731ce51e6df97850340d Mon Sep 17 00:00:00 2001 From: zhuyasen Date: Thu, 8 Feb 2024 16:35:33 +0800 Subject: [PATCH] support database postgresql and tidb --- .github/RELEASE.md | 8 +- Makefile | 2 +- api/serverNameExample/v1/userExample.proto | 2 +- .../initial/close.go | 4 +- .../initial/initApp.go | 4 +- .../initial/close.go | 4 +- .../initial/initApp.go | 4 +- .../initial/close.go | 4 +- .../initial/initApp.go | 4 +- .../initial/close.go | 4 +- .../initial/initApp.go | 4 +- .../initial/close.go | 4 +- .../initial/initApp.go | 4 +- cmd/sponge/commands/generate/cache.go | 61 ++-- cmd/sponge/commands/generate/common.go | 150 +++++++++- cmd/sponge/commands/generate/configmap.go | 126 +++++++++ cmd/sponge/commands/generate/dao.go | 46 ++- cmd/sponge/commands/generate/handler-pb.go | 63 +++-- cmd/sponge/commands/generate/handler.go | 44 ++- cmd/sponge/commands/generate/http-pb.go | 101 +++++-- cmd/sponge/commands/generate/http.go | 120 +++++--- cmd/sponge/commands/generate/model.go | 30 +- cmd/sponge/commands/generate/protobuf.go | 48 ++-- cmd/sponge/commands/generate/rpc-conn.go | 47 ++-- cmd/sponge/commands/generate/rpc-gw-pb.go | 95 +++++-- cmd/sponge/commands/generate/rpc-pb.go | 90 ++++-- cmd/sponge/commands/generate/rpc.go | 137 ++++++--- cmd/sponge/commands/generate/service.go | 65 +++-- cmd/sponge/commands/generate/template.go | 263 +++++++++++++++--- cmd/sponge/commands/micro.go | 4 +- cmd/sponge/commands/patch.go | 1 + cmd/sponge/commands/patch/common.go | 24 ++ cmd/sponge/commands/patch/gen-db-init.go | 148 ++++++++++ cmd/sponge/commands/patch/gen-mysql-init.go | 19 -- cmd/sponge/commands/root.go | 5 +- cmd/sponge/server/handler.go | 86 +++++- cmd/sponge/server/http.go | 1 + cmd/sponge/server/record.go | 5 +- ... app.f965da2e3508ddc9ca932590fe4d1582.css} | 4 +- ....f965da2e3508ddc9ca932590fe4d1582.css.map} | 2 +- cmd/sponge/server/static/index.html | 4 +- .../static/js/app.050e4b824a5634db92e7.js | 2 + .../static/js/app.050e4b824a5634db92e7.js.map | 1 + .../static/js/app.9b5672cd500e42cf6eae.js | 2 - .../static/js/app.9b5672cd500e42cf6eae.js.map | 1 - .../js/manifest.2ae2e69a05c33dfc65f8.js.map | 2 +- ...8864.js => vendor.d8cdb3748af43d2ae51a.js} | 6 +- .../js/vendor.d8cdb3748af43d2ae51a.js.map | 1 + .../js/vendor.f99d8d10a7d35fb68864.js.map | 1 - configs/serverNameExample.yml | 125 +++++---- .../serverNameExample-configmap.yml | 113 +------- docs/docs.go | 2 +- docs/swagger.json | 2 +- docs/swagger.yaml | 2 +- internal/config/serverNameExample.go | 23 +- internal/config/serverNameExample_cc.go | 2 +- internal/dao/userExample.go | 2 +- internal/dao/userExample_test.go | 2 +- internal/handler/userExample.go | 9 +- internal/handler/userExample_logic.go | 9 +- internal/handler/userExample_test.go | 2 +- internal/model/init.go | 191 +++++++------ internal/model/init_test.go | 12 +- internal/model/userExample.go | 4 +- internal/service/userExample.go | 11 +- internal/service/userExample_client_test.go | 4 +- internal/types/userExample_types.go | 2 +- pkg/conf/test.yml | 9 +- pkg/errcode/response.go | 1 + pkg/ggorm/gorm.go | 33 ++- pkg/ggorm/gorm_test.go | 14 + pkg/gotest/dao_test.go | 2 +- pkg/mysql/gorm.go | 1 + pkg/mysql/query/query_condition.go | 3 + pkg/sql2code/parser/mysql.go | 12 +- pkg/sql2code/parser/option.go | 28 +- pkg/sql2code/parser/parser.go | 22 +- pkg/sql2code/parser/parser_test.go | 50 +++- pkg/sql2code/parser/postgresql.go | 118 ++++++++ pkg/sql2code/parser/template.go | 4 +- pkg/sql2code/sql2code.go | 63 ++++- pkg/sql2code/sql2code_test.go | 2 +- scripts/patch.sh | 39 ++- 83 files changed, 2050 insertions(+), 725 deletions(-) create mode 100644 cmd/sponge/commands/generate/configmap.go create mode 100644 cmd/sponge/commands/patch/common.go create mode 100644 cmd/sponge/commands/patch/gen-db-init.go rename cmd/sponge/server/static/css/{app.d073a336e9e3cecd4c7996f962e12160.css => app.f965da2e3508ddc9ca932590fe4d1582.css} (94%) rename cmd/sponge/server/static/css/{app.d073a336e9e3cecd4c7996f962e12160.css.map => app.f965da2e3508ddc9ca932590fe4d1582.css.map} (95%) create mode 100644 cmd/sponge/server/static/js/app.050e4b824a5634db92e7.js create mode 100644 cmd/sponge/server/static/js/app.050e4b824a5634db92e7.js.map delete mode 100644 cmd/sponge/server/static/js/app.9b5672cd500e42cf6eae.js delete mode 100644 cmd/sponge/server/static/js/app.9b5672cd500e42cf6eae.js.map rename cmd/sponge/server/static/js/{vendor.f99d8d10a7d35fb68864.js => vendor.d8cdb3748af43d2ae51a.js} (86%) create mode 100644 cmd/sponge/server/static/js/vendor.d8cdb3748af43d2ae51a.js.map delete mode 100644 cmd/sponge/server/static/js/vendor.f99d8d10a7d35fb68864.js.map create mode 100644 pkg/sql2code/parser/postgresql.go diff --git a/.github/RELEASE.md b/.github/RELEASE.md index 644c220..c6a4957 100644 --- a/.github/RELEASE.md +++ b/.github/RELEASE.md @@ -1,4 +1,8 @@ ## Change log -- Add auto test scripts. -- Repack gorm package. +- Added generate database initialization code command. +- Added support for postgresql, tidb generation code. +- Modify the Sponge UI interface. +- Adjust database configuration in configuration. +- Added generate k8s configmap script command. +- The generated code version matches the local sponge version. diff --git a/Makefile b/Makefile index a51938a..4afdb75 100644 --- a/Makefile +++ b/Makefile @@ -169,7 +169,7 @@ image-build-rpc-test: .PHONY: patch -# patch some dependent code, such as types.proto, mysql initialization code. e.g. make patch TYPE=types-pb , make patch TYPE=mysql-init +# patch some dependent code, such as types.proto, mysql initialization code. e.g. make patch TYPE=types-pb , make patch TYPE=init-mysql, make patch TYPE=init-postgresql patch: @bash scripts/patch.sh $(TYPE) diff --git a/api/serverNameExample/v1/userExample.proto b/api/serverNameExample/v1/userExample.proto index e15a6a3..219ac9c 100644 --- a/api/serverNameExample/v1/userExample.proto +++ b/api/serverNameExample/v1/userExample.proto @@ -301,7 +301,7 @@ message ListUserExampleByIDsReply { message ListUserExampleByLastIDRequest { uint64 lastID = 1 [(tagger.tags) = "form:\"lastID\""]; // last id - uint32 limit = 2 [(validate.rules).uint32.gt = 0, (tagger.tags) = "form:\"limit\""]; // page size + uint32 limit = 2 [(validate.rules).uint32.gt = 0, (tagger.tags) = "form:\"limit\""]; // limit size per page string sort = 3 [(tagger.tags) = "form:\"sort\""]; // sort by column name of table, default is -id, the - sign indicates descending order. } diff --git a/cmd/serverNameExample_grpcExample/initial/close.go b/cmd/serverNameExample_grpcExample/initial/close.go index 1410781..c3cdd08 100644 --- a/cmd/serverNameExample_grpcExample/initial/close.go +++ b/cmd/serverNameExample_grpcExample/initial/close.go @@ -20,9 +20,9 @@ func Close(servers []app.IServer) []app.Close { closes = append(closes, s.Stop) } - // close mysql + // close database closes = append(closes, func() error { - return model.CloseMysql() + return model.CloseDB() }) // close redis diff --git a/cmd/serverNameExample_grpcExample/initial/initApp.go b/cmd/serverNameExample_grpcExample/initial/initApp.go index 39233b8..e0587c8 100644 --- a/cmd/serverNameExample_grpcExample/initial/initApp.go +++ b/cmd/serverNameExample_grpcExample/initial/initApp.go @@ -45,8 +45,8 @@ func InitApp() { logger.Info("init logger succeeded") // initializing database - model.InitMysql() - logger.Info("init mysql succeeded") + model.InitDB() + logger.Infof("init %s succeeded", cfg.Database.Driver) model.InitCache(cfg.App.CacheType) // initializing tracing diff --git a/cmd/serverNameExample_grpcPbExample/initial/close.go b/cmd/serverNameExample_grpcPbExample/initial/close.go index 1d249ca..cb4d6ba 100644 --- a/cmd/serverNameExample_grpcPbExample/initial/close.go +++ b/cmd/serverNameExample_grpcPbExample/initial/close.go @@ -20,9 +20,9 @@ func Close(servers []app.IServer) []app.Close { closes = append(closes, s.Stop) } - // close mysql + // close database //closes = append(closes, func() error { - // return model.CloseMysql() + // return model.CloseDB() //}) // close redis diff --git a/cmd/serverNameExample_grpcPbExample/initial/initApp.go b/cmd/serverNameExample_grpcPbExample/initial/initApp.go index 4942d2c..6831970 100644 --- a/cmd/serverNameExample_grpcPbExample/initial/initApp.go +++ b/cmd/serverNameExample_grpcPbExample/initial/initApp.go @@ -46,8 +46,8 @@ func InitApp() { logger.Info("init logger succeeded") // initializing database - //model.InitMysql() - //logger.Info("init mysql succeeded") + //model.InitDB() + //logger.Infof("init %s succeeded", cfg.Database.Driver) //model.InitCache(cfg.App.CacheType) // initializing tracing diff --git a/cmd/serverNameExample_httpExample/initial/close.go b/cmd/serverNameExample_httpExample/initial/close.go index 1410781..c3cdd08 100644 --- a/cmd/serverNameExample_httpExample/initial/close.go +++ b/cmd/serverNameExample_httpExample/initial/close.go @@ -20,9 +20,9 @@ func Close(servers []app.IServer) []app.Close { closes = append(closes, s.Stop) } - // close mysql + // close database closes = append(closes, func() error { - return model.CloseMysql() + return model.CloseDB() }) // close redis diff --git a/cmd/serverNameExample_httpExample/initial/initApp.go b/cmd/serverNameExample_httpExample/initial/initApp.go index 39233b8..e0587c8 100644 --- a/cmd/serverNameExample_httpExample/initial/initApp.go +++ b/cmd/serverNameExample_httpExample/initial/initApp.go @@ -45,8 +45,8 @@ func InitApp() { logger.Info("init logger succeeded") // initializing database - model.InitMysql() - logger.Info("init mysql succeeded") + model.InitDB() + logger.Infof("init %s succeeded", cfg.Database.Driver) model.InitCache(cfg.App.CacheType) // initializing tracing diff --git a/cmd/serverNameExample_httpPbExample/initial/close.go b/cmd/serverNameExample_httpPbExample/initial/close.go index 1d249ca..cb4d6ba 100644 --- a/cmd/serverNameExample_httpPbExample/initial/close.go +++ b/cmd/serverNameExample_httpPbExample/initial/close.go @@ -20,9 +20,9 @@ func Close(servers []app.IServer) []app.Close { closes = append(closes, s.Stop) } - // close mysql + // close database //closes = append(closes, func() error { - // return model.CloseMysql() + // return model.CloseDB() //}) // close redis diff --git a/cmd/serverNameExample_httpPbExample/initial/initApp.go b/cmd/serverNameExample_httpPbExample/initial/initApp.go index 4942d2c..6831970 100644 --- a/cmd/serverNameExample_httpPbExample/initial/initApp.go +++ b/cmd/serverNameExample_httpPbExample/initial/initApp.go @@ -46,8 +46,8 @@ func InitApp() { logger.Info("init logger succeeded") // initializing database - //model.InitMysql() - //logger.Info("init mysql succeeded") + //model.InitDB() + //logger.Infof("init %s succeeded", cfg.Database.Driver) //model.InitCache(cfg.App.CacheType) // initializing tracing diff --git a/cmd/serverNameExample_mixExample/initial/close.go b/cmd/serverNameExample_mixExample/initial/close.go index 1410781..c3cdd08 100644 --- a/cmd/serverNameExample_mixExample/initial/close.go +++ b/cmd/serverNameExample_mixExample/initial/close.go @@ -20,9 +20,9 @@ func Close(servers []app.IServer) []app.Close { closes = append(closes, s.Stop) } - // close mysql + // close database closes = append(closes, func() error { - return model.CloseMysql() + return model.CloseDB() }) // close redis diff --git a/cmd/serverNameExample_mixExample/initial/initApp.go b/cmd/serverNameExample_mixExample/initial/initApp.go index 39233b8..e0587c8 100644 --- a/cmd/serverNameExample_mixExample/initial/initApp.go +++ b/cmd/serverNameExample_mixExample/initial/initApp.go @@ -45,8 +45,8 @@ func InitApp() { logger.Info("init logger succeeded") // initializing database - model.InitMysql() - logger.Info("init mysql succeeded") + model.InitDB() + logger.Infof("init %s succeeded", cfg.Database.Driver) model.InitCache(cfg.App.CacheType) // initializing tracing diff --git a/cmd/sponge/commands/generate/cache.go b/cmd/sponge/commands/generate/cache.go index a9a8ff8..e33abca 100644 --- a/cmd/sponge/commands/generate/cache.go +++ b/cmd/sponge/commands/generate/cache.go @@ -45,7 +45,17 @@ Examples: } var err error - outPath, err = runCacheCommand(moduleName, cacheName, prefixKey, keyName, keyType, valueName, valueType, outPath) + var g = &stringCacheGenerator{ + moduleName: moduleName, + cacheName: cacheName, + prefixKey: prefixKey, + keyName: keyName, + keyType: keyType, + valueName: valueName, + valueType: valueType, + outPath: outPath, + } + outPath, err = g.generateCode() if err != nil { return err } @@ -78,18 +88,28 @@ using help: return cmd } -func runCacheCommand(moduleName string, cacheName string, prefixKey string, keyName string, - keyType string, valueName string, valueType string, outPath string) (string, error) { +type stringCacheGenerator struct { + moduleName string + cacheName string + prefixKey string + keyName string + keyType string + valueName string + valueType string + outPath string +} + +func (g *stringCacheGenerator) generateCode() (string, error) { subTplName := "cache" r := Replacers[TplNameSponge] if r == nil { return "", errors.New("replacer is nil") } - if prefixKey == "" || prefixKey == ":" { - prefixKey = cacheName + ":" - } else if prefixKey[len(prefixKey)-1] != ':' { - prefixKey += ":" + if g.prefixKey == "" || g.prefixKey == ":" { + g.prefixKey = g.cacheName + ":" + } else if g.prefixKey[len(g.prefixKey)-1] != ':' { + g.prefixKey += ":" } // setting up template information @@ -106,9 +126,9 @@ func runCacheCommand(moduleName string, cacheName string, prefixKey string, keyN r.SetSubDirsAndFiles(subDirs) r.SetIgnoreSubDirs(ignoreDirs...) r.SetIgnoreSubFiles(ignoreFiles...) - fields := addCacheFields(moduleName, r, cacheName, prefixKey, keyName, keyType, valueName, valueType) + fields := g.addFields(r) r.SetReplacementFields(fields) - _ = r.SetOutputDir(outPath, subTplName) + _ = r.SetOutputDir(g.outPath, subTplName) if err := r.SaveFiles(); err != nil { return "", err } @@ -116,22 +136,21 @@ func runCacheCommand(moduleName string, cacheName string, prefixKey string, keyN return r.GetOutputDir(), nil } -func addCacheFields(moduleName string, r replacer.Replacer, cacheName string, prefixKey string, keyName string, - keyType string, valueName string, valueType string) []replacer.Field { +func (g *stringCacheGenerator) addFields(r replacer.Replacer) []replacer.Field { var fields []replacer.Field fields = append(fields, deleteFieldsMark(r, cacheFile, startMark, endMark)...) // match the case where the value type is a pointer - if valueType[0] == '*' { + if g.valueType[0] == '*' { fields = append(fields, []replacer.Field{ { Old: "var valueNameExample valueTypeExample", - New: fmt.Sprintf("%s := &%s{}", valueName, valueType[1:]), + New: fmt.Sprintf("%s := &%s{}", g.valueName, g.valueType[1:]), IsCaseSensitive: false, }, { Old: "&valueNameExample", - New: valueName, + New: g.valueName, IsCaseSensitive: false, }, }...) @@ -140,36 +159,36 @@ func addCacheFields(moduleName string, r replacer.Replacer, cacheName string, pr fields = append(fields, []replacer.Field{ { Old: "github.com/zhufuyi/sponge/internal/model", - New: moduleName + "/internal/model", + New: g.moduleName + "/internal/model", }, { Old: "cacheNameExample", - New: cacheName, + New: g.cacheName, IsCaseSensitive: true, }, { Old: "prefixKeyExample:", - New: prefixKey, + New: g.prefixKey, IsCaseSensitive: false, }, { Old: "keyNameExample", - New: keyName, + New: g.keyName, IsCaseSensitive: false, }, { Old: "keyTypeExample", - New: keyType, + New: g.keyType, IsCaseSensitive: false, }, { Old: "valueNameExample", - New: valueName, + New: g.valueName, IsCaseSensitive: false, }, { Old: "valueTypeExample", - New: valueType, + New: g.valueType, IsCaseSensitive: false, }, }...) diff --git a/cmd/sponge/commands/generate/common.go b/cmd/sponge/commands/generate/common.go index c99b79c..67ccd64 100644 --- a/cmd/sponge/commands/generate/common.go +++ b/cmd/sponge/commands/generate/common.go @@ -2,6 +2,7 @@ package generate import ( + "bufio" "bytes" "errors" "fmt" @@ -19,12 +20,22 @@ import ( const ( // TplNameSponge name of the template TplNameSponge = "sponge" + + // DBDriverMysql mysql driver + DBDriverMysql = "mysql" + // DBDriverPostgresql postgresql driver + DBDriverPostgresql = "postgresql" + // DBDriverTidb tidb driver + DBDriverTidb = "tidb" ) var ( modelFile = "model/userExample.go" modelFileMark = "// todo generate model code to here" + modelInitDBFile = "model/init.go" + modelInitDBFileMark = "// todo generate initialisation database code here" + cacheFile = "cache/cacheNameExample.go" daoFile = "dao/userExample.go" @@ -35,6 +46,10 @@ var ( handlerFileMark = "// todo generate the request and response struct to here" handlerTestFile = "handler/userExample_test.go" + handlerLogicFile = "handler/userExample_logic.go" + serviceLogicFile = "service/userExample.go" + embedTimeMark = "// todo generate the conversion createdAt and updatedAt code here" + httpFile = "server/http.go" protoFile = "v1/userExample.proto" @@ -69,8 +84,16 @@ var ( protoShellFileGRPCMark = "# todo generate grpc files here" protoShellFileMark = "# todo generate api template code command here" - appConfigFile = "configs/serverNameExample.yml" - appConfigFileMark = "# todo generate http or rpc server configuration here" + appConfigFile = "configs/serverNameExample.yml" + appConfigFileMark = "# todo generate http or rpc server configuration here" + appConfigFileMark2 = "# todo generate the database configuration here" + + deploymentConfigFile = "kubernetes/serverNameExample-configmap.yml" + deploymentConfigFileMark = "# todo generate the database configuration for deployment here" + + spongeTemplateVersionMark = "// todo generate the local sponge template code version here" + + configmapFileMark = "# todo generate server configuration code here" readmeFile = "sponge/README.md" makeFile = "sponge/Makefile" @@ -87,6 +110,13 @@ var ( selfPackageName = "github.com/zhufuyi/sponge" ) +var ( + ModelInitDBFile = modelInitDBFile + ModelInitDBFileMark = modelInitDBFileMark + StartMark = startMark + EndMark = endMark +) + func symbolConvert(str string, additionalChar ...string) []byte { char := "" if len(additionalChar) > 0 { @@ -154,6 +184,11 @@ func deleteFieldsMark(r replacer.Replacer, filename string, startMark []byte, en return fields } +// DeleteCodeMark delete code mark fragment +func DeleteCodeMark(r replacer.Replacer, filename string, startMark []byte, endMark []byte) []replacer.Field { + return deleteFieldsMark(r, filename, startMark, endMark) +} + func deleteAllFieldsMark(r replacer.Replacer, filename string, startMark []byte, endMark []byte) []replacer.Field { var fields []replacer.Field @@ -336,3 +371,114 @@ func replacePackage(data []byte, moduleName string, serverName string) []byte { return data } + +func getDBConfigCode(dbDriver string, forDeployment ...bool) string { + isDeployment := false + if len(forDeployment) > 0 { + isDeployment = forDeployment[0] + } + + dbConfigCode := "" + switch strings.ToLower(dbDriver) { + case DBDriverMysql, DBDriverTidb: + if isDeployment { + dbConfigCode = mysqlConfigForDeploymentCode + } else { + dbConfigCode = mysqlConfigCode + } + + case DBDriverPostgresql: + if isDeployment { + dbConfigCode = postgresqlConfigForDeploymentCode + } else { + dbConfigCode = postgresqlConfigCode + } + default: + panic("getDBConfigCode error, unsupported database driver: " + dbDriver) + } + return dbConfigCode +} + +func getInitDBCode(dbDriver string) string { + initDBCode := "" + switch strings.ToLower(dbDriver) { + case DBDriverMysql, DBDriverTidb: + initDBCode = modelInitDBFileMysqlCode + case DBDriverPostgresql: + initDBCode = modelInitDBFilePostgresqlCode + default: + panic("getInitDBCode error, unsupported database driver: " + dbDriver) + } + return initDBCode +} + +// GetInitDataBaseCode get init db code +func GetInitDataBaseCode(dbDriver string) string { + return getInitDBCode(dbDriver) +} + +func getLocalSpongeTemplateVersion() string { + dir, err := os.UserHomeDir() + if err != nil { + fmt.Println("os.UserHomeDir error:", err) + return "" + } + + versionFile := dir + "/.sponge/.github/version" + data, err := os.ReadFile(versionFile) + if err != nil { + fmt.Printf("read file %s error: %v\n", versionFile, err) + return "" + } + + v := string(data) + if v == "" { + return "" + } + return fmt.Sprintf("github.com/zhufuyi/sponge %s", v) +} + +func getEmbedTimeCode(isEmbed bool) string { + if isEmbed { + return embedTimeCode + } + return "" +} + +func convertYamlConfig(configFile string) (string, error) { + f, err := os.Open(configFile) + if err != nil { + return "", err + } + defer f.Close() //nolint + + scanner := bufio.NewScanner(f) + modifiedLines := []string{} + + for scanner.Scan() { + line := scanner.Text() + modifiedLine := " " + line + modifiedLines = append(modifiedLines, modifiedLine) + } + + if err := scanner.Err(); err != nil { + return "", err + } + + return strings.Join(modifiedLines, "\n"), nil +} + +func generateConfigmap(serverName string, outPath string) error { + configFile := fmt.Sprintf(outPath+"/configs/%s.yml", serverName) + configmapFile := fmt.Sprintf(outPath+"/deployments/kubernetes/%s-configmap.yml", serverName) + configFileData, err := convertYamlConfig(configFile) + if err != nil { + return err + } + configmapFileData, err := os.ReadFile(configmapFile) + if err != nil { + return err + } + data := strings.ReplaceAll(string(configmapFileData), configmapFileMark, configFileData) + return os.WriteFile(configmapFile, []byte(data), 0666) +} diff --git a/cmd/sponge/commands/generate/configmap.go b/cmd/sponge/commands/generate/configmap.go new file mode 100644 index 0000000..44d3551 --- /dev/null +++ b/cmd/sponge/commands/generate/configmap.go @@ -0,0 +1,126 @@ +package generate + +import ( + "errors" + "fmt" + + "github.com/zhufuyi/sponge/pkg/replacer" + + "github.com/huandu/xstrings" + "github.com/spf13/cobra" +) + +// ConfigmapCommand generate k8s configmap command +func ConfigmapCommand() *cobra.Command { + var ( + serverName = "" + projectName = "" + configFile = "" + outPath = "" + ) + + cmd := &cobra.Command{ + Use: "configmap", + Short: "Generate k8s configmap", + Long: `generate k8s configmap. + +Examples: + # generate k8s configmap + sponge configmap --server-name=yourServerName --project-name=yourProjectName --config-file=yourConfigFile.yml + + # generate grpc connection code and specify the server directory, Note: code generation will be canceled when the latest generated file already exists. + sponge configmap --server-name=yourServerName --project-name=yourProjectName --config-file=yourConfigFile.yml --out=./yourServerDir +`, + SilenceErrors: true, + SilenceUsage: true, + RunE: func(cmd *cobra.Command, args []string) error { + content, err := convertYamlConfig(configFile) + if err != nil { + return err + } + g := copyConfigGenerator{ + serverName: serverName, + projectName: projectName, + content: content, + outPath: outPath, + } + outPath, err = g.generateCode() + if err != nil { + return err + } + fmt.Printf("\ngenerate \"configmap\" code successfully, out = %s\n", outPath) + return nil + }, + } + + cmd.Flags().StringVarP(&serverName, "server-name", "s", "", "server name") + _ = cmd.MarkFlagRequired("server-name") + cmd.Flags().StringVarP(&projectName, "project-name", "p", "", "project name") + _ = cmd.MarkFlagRequired("project-name") + cmd.Flags().StringVarP(&configFile, "config-file", "f", "", "server config file") + cmd.Flags().StringVarP(&outPath, "out", "o", "", "output directory, default is ./configmap_