in cfg/optimize.go [235:296]
func setFlagValue(cfg *Config, flag string, override flagOverride, isSet isValueSet) error {
// Split the flag name into parts to traverse nested structs.
parts := strings.Split(flag, ".")
if len(parts) == 0 {
return fmt.Errorf("invalid flag name: %s", flag)
}
// Start with the Config.
v := reflect.ValueOf(cfg).Elem()
var field reflect.Value
// Traverse nested structs.
for _, part := range parts {
field = v.FieldByName(convertToCamelCase(part))
if !field.IsValid() {
return fmt.Errorf("invalid flag name: %s", flag)
}
v = field
}
// Check if the field exists.
if !field.IsValid() {
return fmt.Errorf("invalid flag name: %s", flag)
}
// Check if the field is settable.
if !field.CanSet() {
return fmt.Errorf("cannot set flag: %s", flag)
}
// Construct the full flag name for IsSet check.
fullFlagName := strings.ToLower(flag)
// Only override if the user hasn't set it.
if !isSet.IsSet(fullFlagName) {
// Set the value based on the field type.
switch field.Kind() {
case reflect.Bool:
boolValue, ok := override.newValue.(bool)
if !ok {
return fmt.Errorf("invalid boolean value for flag %s: %v", flag, override.newValue)
}
field.SetBool(boolValue)
case reflect.Int, reflect.Int64:
intValue, ok := override.newValue.(int)
if !ok {
return fmt.Errorf("invalid integer value for flag %s: %v", flag, override.newValue)
}
field.SetInt(int64(intValue))
case reflect.String:
stringValue, ok := override.newValue.(string)
if !ok {
return fmt.Errorf("invalid string value for flag %s: %v", flag, override.newValue)
}
field.SetString(stringValue)
default:
return fmt.Errorf("unsupported flag type for flag %s", flag)
}
}
return nil
}