package cmd import ( "github.com/spf13/cobra" "specCon18/bubblewand/internal/render" "specCon18/bubblewand/internal/logger" "github.com/charmbracelet/log" ) // CLI flag variables var ( modName string packageName string programVersion string programDesc string outputDir string logLevel string verbose bool ) // rootCmd renders templates using CLI flags var rootCmd = &cobra.Command{ Use: "bubblewand", Short: "A tool to generate a go project template for building a terminal application with bubbletea + cobra + viper + log", Run: func(cmd *cobra.Command, args []string) { // Initialize logging with log level and flags initLogging() // Fill ProgramData from CLI input data := render.ProgramData{ ModName: modName, PackageName: packageName, ProgramVersion: programVersion, ProgramDesc: programDesc, } // Render templates to the specified output directory if err := render.RenderTemplates(data, outputDir, verbose); err != nil { logger.Log.Fatalf("rendering failed: %v", err) } }, } func init() { // Register flags rootCmd.Flags().StringVar(&modName, "mod-name", "", "Module name (e.g. github.com/user/app)") rootCmd.Flags().StringVar(&packageName, "package-name", "", "Package name") rootCmd.Flags().StringVar(&programVersion, "program-version", "", "Program version") rootCmd.Flags().StringVar(&programDesc, "program-desc", "", "Program description") rootCmd.Flags().StringVarP(&outputDir, "output", "o", "output", "Output directory for rendered files") rootCmd.PersistentFlags().StringVar(&logLevel, "log-level", "info", "Log level (debug, info, warn, error)") rootCmd.PersistentFlags().BoolVarP(&verbose, "verbose", "v", false, "Enable verbose output") // Mark required rootCmd.MarkFlagRequired("mod-name") rootCmd.MarkFlagRequired("package-name") rootCmd.MarkFlagRequired("program-version") rootCmd.MarkFlagRequired("program-desc") } func initLogging() { level, err := log.ParseLevel(logLevel) if err != nil { logger.Log.Warn("Invalid log level; defaulting to info", "input", logLevel) level = log.InfoLevel } logger.Log.SetLevel(level) } // Execute starts the CLI application func Execute() { cobra.CheckErr(rootCmd.Execute()) }