package cmd import ( "fmt" "os" "github.com/spf13/cobra" "go.uber.org/zap" "github.com/spf13/viper" ) var configFile string var debug bool var logger *zap.Logger // rootCmd represents the base command when called without any subcommands var rootCmd = &cobra.Command{ Use: "ble-sensors", Short: "A brief description of your application", Long: `A longer description that spans multiple lines and likely contains examples and usage of using your application. For example: Cobra is a CLI library for Go that empowers applications. This application is a tool to generate the needed files to quickly create a Cobra application.`, // Uncomment the following line if your bare application // has an action associated with it: // Run: func(cmd *cobra.Command, args []string) { }, } // Execute adds all child commands to the root command and sets flags appropriately. // This is called by main.main(). It only needs to happen once to the rootCmd. func Execute() { if err := rootCmd.Execute(); err != nil { fmt.Println(err) os.Exit(1) } } func init() { cobra.OnInitialize(initConfig) rootCmd.PersistentFlags().StringVar(&configFile, "config", "", "config file") rootCmd.PersistentFlags().BoolVar(&debug, "debug", false, "Turn debug messages on.") } func initConfig() { if configFile != "" { viper.SetConfigFile(configFile) } else { viper.AddConfigPath(".") viper.AddConfigPath("/opt/ble-sensors") viper.SetConfigName("ble-sensors") } var err error if debug { logger, err = zap.NewDevelopment() } else { logger, err = zap.NewProduction() } if err != nil { fmt.Printf("unable to initialize logger: %s\n", err.Error()) os.Exit(1) } err = viper.ReadInConfig() if err != nil { fmt.Printf("unable to open config file: %s\n", err.Error()) os.Exit(1) } logger.Info("found config file", zap.String("filename", viper.ConfigFileUsed())) }