Skip to content

Commit

Permalink
Auto-assert setconfig value to predefined struct
Browse files Browse the repository at this point in the history
License: MIT
Signed-off-by: rht <rhtbot@gmail.com>
  • Loading branch information
rht committed Jul 4, 2015
1 parent 224a9eb commit 541836c
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 8 deletions.
2 changes: 1 addition & 1 deletion core/commands/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@ variable set to your preferred text editor.

var configReplaceCmd = &cmds.Command{
Helptext: cmds.HelpText{
Tagline: "Replaces the config with `file>",
Tagline: "Replaces the config with <file>",
ShortDescription: `
Make sure to back up the config file first if neccessary, this operation
can't be undone.
Expand Down
2 changes: 1 addition & 1 deletion docs/fuse.md
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ ipfs daemon --mount
If you wish to allow other users to use the mount points, use the following:

```sh
ipfs config Mounts.FuseAllowOther --bool true
ipfs config Mounts.FuseAllowOther true
ipfs daemon --mount
```

Expand Down
47 changes: 41 additions & 6 deletions repo/fsrepo/fsrepo.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
}

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
Expand Down

0 comments on commit 541836c

Please sign in to comment.