Skip to content

Commit

Permalink
use string for value from pflag (#190)
Browse files Browse the repository at this point in the history
and leave the conversion to mapstructure
  • Loading branch information
ktong authored Mar 2, 2024
1 parent 08b2240 commit 4d4cf9c
Showing 1 changed file with 24 additions and 75 deletions.
99 changes: 24 additions & 75 deletions provider/pflag/pflag.go
Original file line number Diff line number Diff line change
Expand Up @@ -86,96 +86,45 @@ func (f PFlag) Load() (map[string]any, error) { //nolint:cyclop
return
}

val, _ := f.flagVal(set, flag) // Ignore error as it uses whatever returned.
// Skip zero default value to avoid overriding values set by other loader.
if !flag.Changed && (exists(keys) || reflect.ValueOf(val).IsZero()) {
if !flag.Changed && (exists(keys) || zeroDefaultValue(flag)) {
return
}

maps.Insert(values, keys, val)
maps.Insert(values, keys, flag.Value.String())
},
)

return values, nil
}

//nolint:cyclop,funlen,gocyclo,wrapcheck
func (f PFlag) flagVal(set *pflag.FlagSet, flag *pflag.Flag) (any, error) {
func zeroDefaultValue(flag *pflag.Flag) bool { //nolint:cyclop
switch flag.Value.Type() {
case "int":
return set.GetInt(flag.Name)
case "uint":
return set.GetUint(flag.Name)
case "int8":
return set.GetInt8(flag.Name)
case "uint8":
return set.GetUint8(flag.Name)
case "int16":
return set.GetInt16(flag.Name)
case "uint16":
return set.GetUint16(flag.Name)
case "int32":
return set.GetInt32(flag.Name)
case "uint32":
return set.GetUint32(flag.Name)
case "int64":
return set.GetInt64(flag.Name)
case "uint64":
return set.GetUint64(flag.Name)
case "float":
return set.GetFloat64(flag.Name)
case "float32":
return set.GetFloat32(flag.Name)
case "float64":
return set.GetFloat64(flag.Name)
case "bool":
return set.GetBool(flag.Name)
return flag.DefValue == "false"
case "duration":
return set.GetDuration(flag.Name)
case "ip":
return set.GetIP(flag.Name)
case "ipMask":
return set.GetIPv4Mask(flag.Name)
case "ipNet":
return set.GetIPNet(flag.Name)
case "count":
return set.GetCount(flag.Name)
case "bytesHex":
return set.GetBytesHex(flag.Name)
case "bytesBase64":
return set.GetBytesBase64(flag.Name)
// Beginning in Go 1.7, duration zero values are "0s"
return flag.DefValue == "0" || flag.DefValue == "0s"
case "count", "int", "int8", "int16", "int32", "int64",
"uint", "uint8", "uint16", "uint32", "uint64",
"float32", "float64":
return flag.DefValue == "0"
case "string":
return set.GetString(flag.Name)
case "stringSlice":
return set.GetStringSlice(flag.Name)
case "intSlice":
return set.GetIntSlice(flag.Name)
case "uintSlice":
return set.GetUintSlice(flag.Name)
case "int32Slice":
return set.GetInt32Slice(flag.Name)
case "int64Slice":
return set.GetInt64Slice(flag.Name)
case "float32Slice":
return set.GetFloat32Slice(flag.Name)
case "float64Slice":
return set.GetFloat64Slice(flag.Name)
case "boolSlice":
return set.GetBoolSlice(flag.Name)
case "durationSlice":
return set.GetDurationSlice(flag.Name)
case "ipSlice":
return set.GetIPSlice(flag.Name)
case "stringArray":
return set.GetStringArray(flag.Name)
case "stringToString":
return set.GetStringToString(flag.Name)
case "stringToInt":
return set.GetStringToInt(flag.Name)
case "stringToInt64":
return set.GetStringToInt64(flag.Name)
return flag.DefValue == ""
case "ip", "ipMask", "ipNet":
return flag.DefValue == "<nil>"
case
"boolSlice", "durationSlice", "ipSlice",
"bytesHex", "bytesBase64", "stringArray", "stringSlice", "stringToString", "stringToInt", "stringToInt64",
"intSlice", "int32Slice", "int64Slice", "uintSlice", "float32Slice", "float64Slice":
return flag.DefValue == "[]"
default:
return flag.Value.String(), nil
switch flag.DefValue {
case "false", "<nil>", "", "0":
return true
default:
return false
}
}
}

Expand Down

0 comments on commit 4d4cf9c

Please sign in to comment.