package cmd import ( "fmt" "os" "github.com/spf13/cobra" "github.com/spf13/viper" ) var cfgFile string // rootCmd represents the base command when called without any subcommands var rootCmd = &cobra.Command{ Use: "bottin-agenda", Short: "Application de gestion de distribution d'agendas", } // 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() { err := rootCmd.Execute() if err != nil { os.Exit(1) } } func init() { cobra.OnInitialize(initConfig) rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.bottin-agenda.yaml)") // web.api.host rootCmd.PersistentFlags().String( "web-api-host", "api", "Remote API server host (config:'web.api.host')") viper.BindPFlag("web.api.host", rootCmd.PersistentFlags().Lookup("web-api-host")) // web.api.key rootCmd.PersistentFlags().String( "web-api-key", "bottin-agenda", "Remote API server key (config:'web.api.key')") viper.BindPFlag("web.api.key", rootCmd.PersistentFlags().Lookup("web-api-key")) // web.api.protocol rootCmd.PersistentFlags().String( "web-api-protocol", "http", "Remote API server protocol (config:'web.api.protocol')") viper.BindPFlag("web.api.protocol", rootCmd.PersistentFlags().Lookup("web-api-protocol")) // web.api.port rootCmd.PersistentFlags().Int( "web-api-port", 1313, "Remote API server port (config:'web.api.port')") viper.BindPFlag("web.api.port", rootCmd.PersistentFlags().Lookup("web-api-port")) // web.password rootCmd.PersistentFlags().String( "web-password", "bottin-agenda", "Web client password (config:'web.password')") viper.BindPFlag("web.password", rootCmd.PersistentFlags().Lookup("web-password")) // web.port rootCmd.PersistentFlags().Int( "web-port", 2313, "Web client port (config:'web.port')") viper.BindPFlag("web.port", rootCmd.PersistentFlags().Lookup("web-port")) // web.user rootCmd.PersistentFlags().String( "web-user", "bottin-agenda", "Web client user (config:'web.user')") viper.BindPFlag("web.user", rootCmd.PersistentFlags().Lookup("web-user")) // api.key rootCmd.PersistentFlags().String( "api-key", "bottin-agenda", "API server key. Leave empty for no key auth. (config: 'api.key')") viper.BindPFlag("api.key", rootCmd.PersistentFlags().Lookup("api-key")) // api.port rootCmd.PersistentFlags().Int( "api-port", 1313, "API server port (config:'api.port')") viper.BindPFlag("api.port", rootCmd.PersistentFlags().Lookup("api-port")) // bottin.api.host rootCmd.PersistentFlags().String( "bottin-api-host", "api", "Remote bottin API server host (config:'bottin.api.host')") viper.BindPFlag("bottin.api.host", rootCmd.PersistentFlags().Lookup("bottin-api-host")) // bottin.api.key rootCmd.PersistentFlags().String( "bottin-api-key", "bottin", "Remote bottin API server key (config:'bottin.api.key')") viper.BindPFlag("bottin.api.key", rootCmd.PersistentFlags().Lookup("bottin-api-key")) // bottin.api.protocol rootCmd.PersistentFlags().String( "bottin-api-protocol", "http", "Remote bottin API server protocol (config:'bottin.api.protocol')") viper.BindPFlag("bottin.api.protocol", rootCmd.PersistentFlags().Lookup("bottin-api-protocol")) // bottin.api.port rootCmd.PersistentFlags().Int( "bottin-api-port", 1312, "Remote bottin API server port (config:'bottin.api.port')") viper.BindPFlag("bottin.api.port", rootCmd.PersistentFlags().Lookup("bottin-api-port")) // db.database rootCmd.PersistentFlags().String("db-database", "bottin-agenda", "Postgres database (config:'db.database')") viper.BindPFlag("db.database", rootCmd.PersistentFlags().Lookup("db-database")) // db.host rootCmd.PersistentFlags().String("db-host", "db", "Postgres host (config:'db.host')") viper.BindPFlag("db.host", rootCmd.PersistentFlags().Lookup("db-host")) // db.password rootCmd.PersistentFlags().String("db-password", "bottin-agenda", "Postgres password (config:'db.password')") viper.BindPFlag("db.password", rootCmd.PersistentFlags().Lookup("db-password")) // db.port rootCmd.PersistentFlags().Int("db-port", 5432, "Postgres port (config:'db.port')") viper.BindPFlag("db.port", rootCmd.PersistentFlags().Lookup("db-port")) // db.user rootCmd.PersistentFlags().String("db-user", "bottin-agenda", "Postgres user (config:'db.user')") viper.BindPFlag("db.user", rootCmd.PersistentFlags().Lookup("db-user")) } // initConfig reads in config file and ENV variables if set. func initConfig() { if cfgFile != "" { // Use config file from the flag. viper.SetConfigFile(cfgFile) } else { // Find home directory. home, err := os.UserHomeDir() cobra.CheckErr(err) // Search config in home directory with name ".bottin-agenda" (without extension). viper.AddConfigPath(home) viper.SetConfigType("yaml") viper.SetConfigName(".bottin-agenda") } viper.AutomaticEnv() // read in environment variables that match // If a config file is found, read it in. if err := viper.ReadInConfig(); err == nil { fmt.Fprintln(os.Stderr, "Using config file:", viper.ConfigFileUsed()) } }