/* Package config provides types and methods for managing this application's config options and flags */ package config import ( "github.com/spf13/cobra" "github.com/spf13/viper" ) type Config struct { API APIConfig Bottin BottinConfig Web WebConfig } type APIConfig struct { Port int } type BottinConfig struct { API struct { Host string Key string Port int Protocol string } } type WebConfig struct { Port int } func UnmarshalConfig() (cfg Config, err error) { return cfg, viper.Unmarshal(&cfg) } // RegisterInt registers a new cobra int flag and associated viper config option func RegisterInt(cmd *cobra.Command, isPersistent bool, viperName, cobraName, cobraDescription string, cobraDefault int) error { if isPersistent { cmd.PersistentFlags().Int(cobraName, cobraDefault, cobraDescription) return viper.BindPFlag(viperName, cmd.PersistentFlags().Lookup(cobraName)) } else { cmd.Flags().Int(cobraName, cobraDefault, cobraDescription) return viper.BindPFlag(viperName, cmd.Flags().Lookup(cobraName)) } } // RegisterString registers a new cobra string flag and associated viper config option func RegisterString(cmd *cobra.Command, isPersistent bool, viperName, cobraName, cobraDescription string, cobraDefault string) error { if isPersistent { cmd.PersistentFlags().String(cobraName, cobraDefault, cobraDescription) return viper.BindPFlag(viperName, cmd.PersistentFlags().Lookup(cobraName)) } else { cmd.Flags().String(cobraName, cobraDefault, cobraDescription) return viper.BindPFlag(viperName, cmd.Flags().Lookup(cobraName)) } } // RegisterFlags adds persistent flags necessary to the application to the specified *cobra.Command func RegisterFlags(cmd *cobra.Command) error { // api.port ; --api-port cmd.PersistentFlags().Int("api-port", 3182, "API server port") if err := viper.BindPFlag("api.port", cmd.PersistentFlags().Lookup("api-port")); err != nil { return err } // bottin.api.host if err := RegisterString(cmd, true, "bottin.api.host", "bottin-api-host", "Bottin API server host", "localhost"); err != nil { return err } // bottin.api.key if err := RegisterString(cmd, true, "bottin.api.key", "bottin-api-key", "Bottin API server key", "bottin"); err != nil { return err } // bottin.api.port if err := RegisterInt(cmd, true, "bottin.api.port", "bottin-api-port", "Bottin API server port", 1312); err != nil { return err } // bottin.api.protocol if err := RegisterString(cmd, true, "bottin.api.protocol", "bottin-api-protocol", "Bottin API server protocol", "http"); err != nil { return err } // web.port ; --web-port cmd.PersistentFlags().Int("web-port", 3183, "Webserver port") if err := viper.BindPFlag("web.port", cmd.PersistentFlags().Lookup("web-port")); err != nil { return err } return nil }