package cmd import ( "fmt" "path/filepath" "strings" "github.com/manifoldco/promptui" "github.com/spf13/cobra" "golang.org/x/text/cases" "golang.org/x/text/language" ) var handlerTypes = map[string]string{ "HTTP (REST)": "http", "gRPC": "grpc", } func init() { newCmd.AddCommand(handlerCmd) } var handlerCmd = &cobra.Command{ Use: "handler", Short: "Create a new handler", Long: `Create a new handler for your Keystone project.`, Run: genHandler, } type HandlerTemplateData struct { ModuleName string Name string } func genHandler(cmd *cobra.Command, args []string) { namePrompt := promptui.Prompt{ Label: "Handler Name", } handlerNameInput, err := namePrompt.Run() if err != nil { fmt.Printf("Prompt failed %v\n", err) return } handlerTypeInput := promptui.Select{ Label: "Select API Type", Items: []string{"HTTP (REST)", "gRPC"}, } _, result, err := handlerTypeInput.Run() if err != nil { fmt.Printf("Prompt failed %v\n", err) return } moduleName, err := getModuleName() if err != nil { fmt.Printf("❌ Error retrieving module name: %v\n", err) return } mappedHandlerType := handlerTypes[result] handlerName := strings.ToLower(handlerNameInput) cases := cases.Title(language.English) fmt.Printf("🚀 Creating handler '%s' as %s...\n", handlerNameInput, result) if err := genFile( fmt.Sprintf("templates/handler_%s.go.tpl", mappedHandlerType), handlerName, filepath.Join("internal/handlers", mappedHandlerType, fmt.Sprintf("%s.go", handlerName)), HandlerTemplateData{ ModuleName: moduleName, Name: cases.String(handlerNameInput), }, ); err != nil { fmt.Printf("❌ Error creating handler: %v\n", err) return } fmt.Printf("✅ Handler '%s' created successfully at %s\n", handlerNameInput, filepath.Join("internal/handlers", mappedHandlerType, fmt.Sprintf("%s.go", handlerName))) }