Skip to content

Commit

Permalink
cli: enhance usecase generator & apply in delivery
Browse files Browse the repository at this point in the history
  • Loading branch information
agungdwiprasetyo committed Jul 12, 2024
1 parent 0322cc4 commit 51a10a8
Show file tree
Hide file tree
Showing 15 changed files with 516 additions and 92 deletions.
71 changes: 33 additions & 38 deletions cmd/candi/cli_parser.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package main

import (
"fmt"
"os"
"path/filepath"
"slices"
"sort"
"strings"
Expand All @@ -25,63 +25,58 @@ func parseInput(flagParam *flagParameter) (srvConfig serviceConfig) {
scope, ok := scopeMap[flagParam.scopeFlag]
switch scope {
case InitService:
flagParam.serviceName = inputServiceName()
flagParam.serviceName = cliStageInputServiceName()
srvConfig.ServiceName = flagParam.serviceName

case AddModule:
flagParam.addModule = true
if flagParam.isMonorepo {
stageInputServiceNameModule:
flagParam.serviceName = readInput("Please input existing service name to be added module(s):")
_, err := os.Stat(flagParam.outputFlag + flagParam.serviceName)
var errMessage string
if strings.TrimSpace(flagParam.serviceName) == "" {
errMessage = "Service name cannot empty"
}
if os.IsNotExist(err) {
errMessage = fmt.Sprintf(`Service "%s" is not exist in "%s" directory`, flagParam.serviceName, flagParam.outputFlag)
}
if errMessage != "" {
fmt.Printf(RedFormat, errMessage+", try again")
goto stageInputServiceNameModule
}
flagParam.serviceName = cliStageInputExistingServiceName(flagParam.outputFlag,
"Please input existing service name to be added module(s):")
srvConfig = loadSavedConfig(flagParam)
}

case AddHandler:
flagParam.addHandler = true
if flagParam.isMonorepo {
stageInputServiceName:
flagParam.serviceName = readInput("Please input existing service name to be added delivery handler(s):")
srvConfig.ServiceName = flagParam.serviceName
if err := flagParam.validateServiceName(); err != nil {
fmt.Print(err.Error())
goto stageInputServiceName
}
flagParam.serviceName = cliStageInputExistingServiceName(flagParam.outputFlag,
"Please input existing service name to be added delivery handler(s):")
srvConfig = loadSavedConfig(flagParam)
srvConfig.ServiceName = flagParam.serviceName
}

stageReadInputModule:
flagParam.moduleName = candihelper.ToDelimited(readInput("Please input existing module name to be added delivery handler(s):"), '-')
moduleDir := flagParam.getFullModuleChildDir()
if err := validateDir(moduleDir); err != nil {
fmt.Print(err.Error())
goto stageReadInputModule
}
flagParam.moduleName = cliStageInputModule(filepath.Join(flagParam.outputFlag, flagParam.serviceName, "internal/modules"),
"Please input existing module name to be added delivery handler(s):")
goto stageSelectServerHandler

case AddUsecase:
stageAddUsecaseReadInputModule:
flagParam.moduleName = candihelper.ToDelimited(readInput("Please input existing module name to be added usecase(s):"), '-')
moduleDir := flagParam.getFullModuleChildDir()
if err := validateDir(moduleDir); err != nil {
fmt.Print(err.Error())
goto stageAddUsecaseReadInputModule
if flagParam.isMonorepo {
flagParam.serviceName = cliStageInputExistingServiceName(flagParam.outputFlag,
"Please input existing service name to be added usecase(s):")
}
flagParam.moduleName = cliStageInputModule(filepath.Join(flagParam.outputFlag, flagParam.serviceName, "internal/modules"),
"Please input existing module name to be added usecase:")
ucName := cliStageInputUsecaseName(flagParam.getFullModuleChildDir())
deliveryHandlers := cliStageInputExistingDelivery(flagParam.getFullModuleChildDir())
if flagParam.serviceName == "" {
flagParam.serviceName = srvConfig.ServiceName
}
addUsecase(flagParam, ucName, deliveryHandlers)
return

flagParam.serviceName = srvConfig.ServiceName
addUsecase(flagParam, readInput("Please input usecase name:"))
case ApplyUsecase:
if flagParam.isMonorepo {
flagParam.serviceName = cliStageInputExistingServiceName(flagParam.outputFlag,
"Please input existing service name:")
}
flagParam.moduleName = cliStageInputModule(filepath.Join(flagParam.outputFlag, flagParam.serviceName, "internal/modules"),
"Please input existing module name:")
ucName := cliStageInputExistingUsecaseName(flagParam.getFullModuleChildDir())
deliveryHandlers := cliStageInputExistingDelivery(flagParam.getFullModuleChildDir())
if flagParam.serviceName == "" {
flagParam.serviceName = srvConfig.ServiceName
}
applyUsecaseToDelivery(flagParam, ucName, deliveryHandlers)
return
}

Expand Down
107 changes: 107 additions & 0 deletions cmd/candi/cli_stage.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
package main

import (
"fmt"
"os"
"path/filepath"
"strings"

"github.com/golangid/candi/candihelper"
)

func cliStageInputServiceName() (serviceName string) {
serviceName = readInput("Please input service name:")
_, err := os.Stat(serviceName)
var errMessage string
if strings.TrimSpace(serviceName) == "" {
errMessage = "Service name cannot empty"
}
if !os.IsNotExist(err) {
errMessage = "Folder already exists"
}
if errMessage != "" {
fmt.Printf(RedFormat, errMessage+", try again")
serviceName = cliStageInputServiceName()
}
return
}

func inputOwnerName() (ownerName string) {
ownerName = readInput("Please input owner name:")
var errMessage string
if strings.TrimSpace(ownerName) == "" {
errMessage = "Owner name cannot empty"
}

if errMessage != "" {
fmt.Printf(RedFormat, errMessage+", try again")
ownerName = inputOwnerName()
}
return
}

func cliStageInputExistingServiceName(prefixPath, cmd string) string {
stageInputServiceName:
serviceName := readInput(cmd)
_, err := os.Stat(filepath.Join(prefixPath, serviceName))
var errMessage string
if strings.TrimSpace(serviceName) == "" {
errMessage = "Service name cannot empty"
}
if os.IsNotExist(err) {
errMessage = fmt.Sprintf(`Service "%s" is not exist in "%s" directory`, serviceName, prefixPath)
}
if errMessage != "" {
fmt.Printf(RedFormat, errMessage+", try again")
goto stageInputServiceName
}
return serviceName
}

func cliStageInputModule(prefixPath, cmd string) string {
stageReadInputModule:
moduleName := candihelper.ToDelimited(readInput(cmd), '-')
if err := validateDir(filepath.Join(prefixPath, moduleName)); err != nil {
fmt.Print(err.Error())
goto stageReadInputModule
}
return moduleName
}

func cliStageInputUsecaseName(prefixPath string) string {
stageAddUsecaseInputName:
ucName := readInput("Please input usecase name:")
dir := filepath.Join(prefixPath, "usecase", candihelper.ToDelimited(ucName, '_')+".go")
if err := validateDir(dir); err == nil {
fmt.Printf(RedFormat, "Usecase "+dir+" is exist, try another usecase name")
goto stageAddUsecaseInputName
}
return ucName
}

func cliStageInputExistingUsecaseName(prefixPath string) string {
stageAddUsecaseInputName:
ucName := readInput("Please input usecase name:")
dir := filepath.Join(prefixPath, "usecase", candihelper.ToDelimited(ucName, '_')+".go")
if err := validateDir(dir); err != nil {
fmt.Printf(RedFormat, "Usecase "+dir+" not exist")
goto stageAddUsecaseInputName
}
return ucName
}

func cliStageInputExistingDelivery(prefixPath string) (deliveryHandlers []string) {
wording, deliveryHandlerMap := getAllModuleHandler(prefixPath)
stageSelectDeliveryHandler:
cmdInput := readInput("Apply in delivery handler (separated by comma, enter for skip):\n" + wording)
for _, str := range strings.Split(strings.Trim(cmdInput, ","), ",") {
if delName, ok := deliveryHandlerMap[strings.TrimSpace(str)]; ok {
deliveryHandlers = append(deliveryHandlers, delName)
} else if str != "" {
fmt.Printf(RedFormat, "Invalid option, try again")
deliveryHandlers = []string{}
goto stageSelectDeliveryHandler
}
}
return deliveryHandlers
}
24 changes: 21 additions & 3 deletions cmd/candi/constant.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package main

import "strings"

const (
Ps1 = "\x1b[32;1m>>> \x1b[0m"
RedFormat = "\x1b[31;1m%s \x1b[0m\n"
Expand All @@ -9,6 +11,7 @@ const (
RunServiceMonorepo = "runServiceMonorepo"
AddHandler = "addHandler"
AddUsecase = "addUsecase"
ApplyUsecase = "applyUsecase"

RestHandler = "restHandler"
GrpcHandler = "grpcHandler"
Expand All @@ -19,9 +22,10 @@ const (
TaskqueueHandler = "taskqueueHandler"
PostgresListenerHandler = "postgresListenerHandler"
RabbitmqHandler = "rabbitmqHandler"
RedisDeps = "redisDeps"
SqldbDeps = "sqldbDeps"
MongodbDeps = "mongodbDeps"

RedisDeps = "redisDeps"
SqldbDeps = "sqldbDeps"
MongodbDeps = "mongodbDeps"

// plugin
ArangodbDeps = "arangodbDeps"
Expand All @@ -34,3 +38,17 @@ const (
DefaultPackageName = "github.com/golangid/candi"
CandiPackagesEnv = "CANDI_CLI_PACKAGES"
)

var deliveryHandlerLocation = map[string]string{
RestHandler: "resthandler/resthandler.go",
GrpcHandler: "grpchandler/grpchandler.go",
GraphqlHandler: "graphqlhandler/query_resolver.go",
KafkaHandler: "workerhandler/kafka_handler.go",
SchedulerHandler: "workerhandler/cron_handler.go",
RedissubsHandler: "workerhandler/redis_handler.go",
TaskqueueHandler: "workerhandler/taskqueue_handler.go",
PostgresListenerHandler: "workerhandler/postgres_listener_handler.go",
RabbitmqHandler: "workerhandler/rabbitmq_handler.go",
pluginGCPPubSubWorker: "workerhandler/" + strings.ToLower(pluginGCPPubSubWorker) + "_handler.go",
pluginSTOMPWorker: "workerhandler/" + strings.ToLower(pluginSTOMPWorker) + "_handler.go",
}
3 changes: 2 additions & 1 deletion cmd/candi/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,8 @@ func main() {
"2) Init service\n" +
"3) Add module(s) in service\n" +
"4) Add delivery handler(s) in module\n" +
"5) Add usecase(s) in module\033[0m\n>> ")
"5) Add usecase in module\n" +
"6) Apply usecase to delivery(s) in module\033[0m\n>> ")
flagParam.scopeFlag = readInput()
}

Expand Down
2 changes: 1 addition & 1 deletion cmd/candi/project_generator.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import (
)

func projectGenerator(flagParam flagParameter, scope string, srvConfig serviceConfig) {
if flagParam.addHandler || scope == AddUsecase {
if flagParam.addHandler || scope == AddUsecase || scope == ApplyUsecase {
return
}

Expand Down
1 change: 1 addition & 0 deletions cmd/candi/project_generator_add_handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ func scopeAddHandler(flagParam *flagParameter, cfg serviceConfig, serverHandlers
if mod.ModuleName == "" {
log.Fatal("module is empty")
}
mod.configHeader = cfg.configHeader

apiProtoStructure := FileStructure{
TargetDir: "proto/", IsDir: true, SkipIfExist: true,
Expand Down
Loading

0 comments on commit 51a10a8

Please sign in to comment.