package cmd import ( "os" "git.devices.local/mawas/golang-api-skeleton/cmd/add" "git.devices.local/mawas/golang-api-skeleton/cmd/server" "git.devices.local/mawas/golang-api-skeleton/lib/config" "github.com/spf13/cobra" ) // TODO add shell completion func newRootCmd(appName string, appDescription string) *cobra.Command { return &cobra.Command{ Use: appName, Short: appDescription, Long: appDescription, // SilenceUsage: true, // SilenceErrors: true, DisableAutoGenTag: true, Run: func(cmd *cobra.Command, args []string) { }, } } func NewRootCmd(version string, appName string, appDescription string) *cobra.Command { cmd := &cobra.Command{ Use: appName, Short: appDescription, Long: appDescription, // SilenceUsage: true, // SilenceErrors: true, DisableAutoGenTag: true, RunE: func(cmd *cobra.Command, args []string) error { err := cmd.Usage() return err }, } // cmd.SetHelpFunc(func(cmd *cobra.Command, args []string) { // if err := cmd.Usage(); err != nil { // os.Exit(1) // } // os.Exit(0) // }) cmd.AddCommand(newVersionCmd(version, appName)) cmd.AddCommand(newSampleCfgCmd()) cfgFile, flagCfg := getFlags(cmd) cmd.SetHelpCommand(add.Command(appName, cfgFile, flagCfg)) cmd.AddCommand(server.Command(version, appName, cfgFile, flagCfg)) return cmd } func newVersionCmd(version string, appName string) *cobra.Command { return &cobra.Command{ Use: "version", Aliases: []string{"Version"}, Short: "Print the version number", Long: "Print the version number", DisableAutoGenTag: true, Run: func(cmd *cobra.Command, args []string) { cmd.Println(appName, "version", version) // os.Exit(0) }, } } func newSampleCfgCmd() *cobra.Command { return &cobra.Command{ Use: "sample-config", Short: "Print sample config", Long: "Print an example configuration file content", Run: func(cmd *cobra.Command, args []string) { cmd.Println(config.Sample) os.Exit(0) }, } } // func createAdminCmd(userService *services.UserService) *cobra.Command { // return &cobra.Command{ // Use: "admin", // Short: "Create initial admin user", // Long: "Create initial admin user", // RunE: func(cmd *cobra.Command, args []string) error{ // adminUser := &models.Token{ // ExpiresAt: time.Now().Add(24 * time.Hour), // UserID: userID, // Active: true, // } // if result1, err := tokenService.Create(token1); err != nil { // panic(err) // } // }, // } // } // func newSampleCLICmd() *cobra.Command { // return &cobra.Command{ // Use: "cli", // Short: "Interactive CLI", // Long: "Interactive CLI maybe", // Run: func(cmd *cobra.Command, args []string) { // cmd.Println("here might be an cli") // os.Exit(0) // }, // } // } func Initialize(version string, appName string, appDescription string) (string, map[string]interface{}, error) { var cfgFile string rootCmd := newRootCmd(appName, appDescription) rootCmd.SetHelpFunc(func(cmd *cobra.Command, args []string) { if err := cmd.Usage(); err != nil { os.Exit(1) } os.Exit(0) }) rootCmd.AddCommand(newVersionCmd(version, appName)) rootCmd.AddCommand(newSampleCfgCmd()) // rootCmd.AddCommand(newSampleCLICmd()) rootCmd.PersistentFlags().StringVarP(&cfgFile, "config", "c", "", "config file") flagCfg := map[string]interface{}{ "application.environment": rootCmd.PersistentFlags().StringP("environment", "e", "", "application environment"), "application.listenaddress": rootCmd.PersistentFlags().StringP("listenaddress", "l", "", "application listenaddress or host"), "application.port": rootCmd.PersistentFlags().IntP("port", "p", 0, "application listenport"), "database.host": rootCmd.PersistentFlags().StringP("database-host", "H", "", "database host"), "database.port": rootCmd.PersistentFlags().IntP("database-port", "P", 0, "database port"), "database.dialect": rootCmd.PersistentFlags().StringP("database-dialect", "D", "", "database dialect"), "database.database": rootCmd.PersistentFlags().StringP("database-name", "d", "", "database name"), "database.user": rootCmd.PersistentFlags().StringP("database-user", "u", "", "database user"), "database.password": rootCmd.PersistentFlags().StringP("database-password", "s", "", "database password"), "database.maxopenconn": rootCmd.PersistentFlags().IntP("database-maxopen", "o", 0, "database max open connections"), "database.maxidleconn": rootCmd.PersistentFlags().IntP("database-maxidle", "i", 0, "database max idle connections"), "database.maxlifetime": rootCmd.PersistentFlags().IntP("database-maxlifetime", "t", 0, "database max connection lifetime"), } if err := rootCmd.Execute(); err != nil { return cfgFile, flagCfg, err } return cfgFile, flagCfg, nil } func getFlags(cmd *cobra.Command) (cfgFile string, flagCfg map[string]interface{}) { cmd.PersistentFlags().StringVarP(&cfgFile, "config", "c", "", "config file") flagCfg = map[string]interface{}{ "application.environment": cmd.PersistentFlags().StringP("environment", "e", "", "application environment"), "application.listenaddress": cmd.PersistentFlags().StringP("listenaddress", "l", "", "application listenaddress or host"), "application.port": cmd.PersistentFlags().IntP("port", "p", 0, "application listenport"), "database.host": cmd.PersistentFlags().StringP("database-host", "H", "", "database host"), "database.port": cmd.PersistentFlags().IntP("database-port", "P", 0, "database port"), "database.dialect": cmd.PersistentFlags().StringP("database-dialect", "D", "", "database dialect"), "database.database": cmd.PersistentFlags().StringP("database-name", "d", "", "database name"), "database.user": cmd.PersistentFlags().StringP("database-user", "u", "", "database user"), "database.password": cmd.PersistentFlags().StringP("database-password", "s", "", "database password"), "database.maxopenconn": cmd.PersistentFlags().IntP("database-maxopen", "o", 0, "database max open connections"), "database.maxidleconn": cmd.PersistentFlags().IntP("database-maxidle", "i", 0, "database max idle connections"), "database.maxlifetime": cmd.PersistentFlags().IntP("database-maxlifetime", "t", 0, "database max connection lifetime"), } return cfgFile, flagCfg } // func Initialize(version string, appName string, appDescription string) error { // var cfgFile string // rootCmd := newRootCmd(appName, appDescription) // rootCmd.SetHelpFunc(func(cmd *cobra.Command, args []string) { // if err := cmd.Usage(); err != nil { // os.Exit(1) // } // os.Exit(0) // }) // rootCmd.AddCommand(newVersionCmd(version, appName)) // rootCmd.AddCommand(newSampleCfgCmd()) // // rootCmd.AddCommand(newSampleCLICmd()) // // rootCmd.Flags().StringVarP(&cfgFile, "config", "c", "", "config file") // flagCfg := map[string]interface{}{ // "application.environment": rootCmd.Flags().StringP("environment", "e", "", "application environment"), // "application.listenaddress": rootCmd.Flags().StringP("listenaddress", "l", "", "application listenaddress or host"), // "application.port": rootCmd.Flags().IntP("port", "p", 0, "application listenport"), // "database.host": rootCmd.Flags().StringP("database-host", "H", "", "database host"), // "database.port": rootCmd.Flags().IntP("database-port", "P", 0, "database port"), // "database.dialect": rootCmd.Flags().StringP("database-dialect", "D", "", "database dialect"), // "database.database": rootCmd.Flags().StringP("database-name", "d", "", "database name"), // "database.user": rootCmd.Flags().StringP("database-user", "u", "", "database user"), // "database.password": rootCmd.Flags().StringP("database-password", "s", "", "database password"), // "database.maxopenconn": rootCmd.Flags().IntP("database-maxopen", "o", 0, "database max open connections"), // "database.maxidleconn": rootCmd.Flags().IntP("database-maxidle", "i", 0, "database max idle connections"), // "database.maxlifetime": rootCmd.Flags().IntP("database-maxlifetime", "t", 0, "database max connection lifetime"), // } // if err := rootCmd.Execute(); err != nil { // return err // } // if err := config.Initialize(appName, cfgFile, flagCfg); err != nil { // return err // } // return nil // }