func (v *Viper) Get(key string) interface{} { path := strings.Split(key, v.keyDelim) val := v.find(strings.ToLower(key)) if val == nil { source := v.find(path[0]) if source == nil { return nil } if reflect.TypeOf(source).Kind() == reflect.Map { val = v.searchMap(cast.ToStringMap(source), path[1:]) } } switch val.(type) { case bool: return cast.ToBool(val) case string: return cast.ToString(val) case int64, int32, int16, int8, int: return cast.ToInt(val) case float64, float32: return cast.ToFloat64(val) case time.Time: return cast.ToTime(val) case time.Duration: return cast.ToDuration(val) case []string: return val } return val }
// parseSizeInBytes converts strings like 1GB or 12 mb into an unsigned integer number of bytes func parseSizeInBytes(sizeStr string) uint { sizeStr = strings.TrimSpace(sizeStr) lastChar := len(sizeStr) - 1 multiplier := uint(1) if lastChar > 0 { if sizeStr[lastChar] == 'b' || sizeStr[lastChar] == 'B' { if lastChar > 1 { switch unicode.ToLower(rune(sizeStr[lastChar-1])) { case 'k': multiplier = 1 << 10 sizeStr = strings.TrimSpace(sizeStr[:lastChar-1]) case 'm': multiplier = 1 << 20 sizeStr = strings.TrimSpace(sizeStr[:lastChar-1]) case 'g': multiplier = 1 << 30 sizeStr = strings.TrimSpace(sizeStr[:lastChar-1]) default: multiplier = 1 sizeStr = strings.TrimSpace(sizeStr[:lastChar]) } } } } size := cast.ToInt(sizeStr) if size < 0 { size = 0 } return safeMul(uint(size), multiplier) }
func (v *Viper) BindPFlag(key string, flag *pflag.Flag) (err error) { if flag == nil { return fmt.Errorf("flag for %q is nil", key) } v.pflags[strings.ToLower(key)] = flag switch flag.Value.Type() { case "int", "int8", "int16", "int32", "int64": v.SetDefault(key, cast.ToInt(flag.Value.String())) case "bool": v.SetDefault(key, cast.ToBool(flag.Value.String())) default: v.SetDefault(key, flag.Value.String()) } return nil }
func (v *Viper) BindPFlags(flags *pflag.FlagSet) (err error) { flags.VisitAll(func(flag *pflag.Flag) { if err != nil { // an error has been encountered in one of the previous flags return } err = v.BindPFlag(flag.Name, flag) switch flag.Value.Type() { case "int", "int8", "int16", "int32", "int64": v.SetDefault(flag.Name, cast.ToInt(flag.Value.String())) case "bool": v.SetDefault(flag.Name, cast.ToBool(flag.Value.String())) default: v.SetDefault(flag.Name, flag.Value.String()) } }) return }
func (v *Viper) GetInt(key string) int { return cast.ToInt(v.Get(key)) }