-
-
Notifications
You must be signed in to change notification settings - Fork 3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Assert and convert config value into predefined struct #1440
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -495,19 +495,54 @@ func (r *FSRepo) SetConfigKey(key string, value interface{}) error { | |
if err != nil { | ||
return err | ||
} | ||
switch v := value.(type) { | ||
case string: | ||
if i, err := strconv.Atoi(v); err == nil { | ||
value = i | ||
} | ||
} | ||
var mapconf map[string]interface{} | ||
if err := serialize.ReadConfigFile(filename, &mapconf); err != nil { | ||
return err | ||
} | ||
|
||
// Get the type of the value associated with the key | ||
oldValue, err := common.MapGetKV(mapconf, key) | ||
ok := true | ||
if err != nil { | ||
// key-value does not exist yet | ||
switch v := value.(type) { | ||
case string: | ||
value, err = strconv.ParseBool(v) | ||
if err != nil { | ||
value, err = strconv.Atoi(v) | ||
if err != nil { | ||
value, err = strconv.ParseFloat(v, 32) | ||
if err != nil { | ||
value = v | ||
} | ||
} | ||
} | ||
default: | ||
} | ||
} else { | ||
switch oldValue.(type) { | ||
case bool: | ||
value, ok = value.(bool) | ||
case int: | ||
value, ok = value.(int) | ||
case float32: | ||
value, ok = value.(float32) | ||
case string: | ||
value, ok = value.(string) | ||
default: | ||
value = value | ||
} | ||
if !ok { | ||
return fmt.Errorf("Wrong config type, expected %T", oldValue) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This entire switch-case can be moved to common if we expect the values in the "json object" to not change in type. Wish could be cleaner. |
||
} | ||
} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. i think this is actually bad-- if i edit a config and accidentally set the wrong type value, we cannot fix it from the CLI. this is getting complicated. let's just assume string and require There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The "if i ..." case here is very specific to user-specified value. But sure I can remove the granular type checks, although there is already a cruder version of type-check after those lines (which does similar things but doesn't pinpoint exactly where the err is). There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. ok. to confirm, want:
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yes, this is unchanged. |
||
|
||
if err := common.MapSetKV(mapconf, key, value); err != nil { | ||
return err | ||
} | ||
|
||
// This step doubles as to validate the map against the struct | ||
// before serialization | ||
conf, err := config.FromMap(mapconf) | ||
if err != nil { | ||
return err | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ok, so here is a clear case of what i'm talking about:
if i wanted the value
"true"
, i would expect the 2nd line to work.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
i think it will just be less confusing overall to require using
--json