42 lines
1.3 KiB
Go
42 lines
1.3 KiB
Go
package hilmapstructure
|
|
|
|
import (
|
|
"fmt"
|
|
"reflect"
|
|
|
|
"github.com/mitchellh/mapstructure"
|
|
)
|
|
|
|
var hilMapstructureDecodeHookEmptySlice []interface{}
|
|
var hilMapstructureDecodeHookStringSlice []string
|
|
var hilMapstructureDecodeHookEmptyMap map[string]interface{}
|
|
|
|
// WeakDecode behaves in the same way as mapstructure.WeakDecode but has a
|
|
// DecodeHook which defeats the backward compatibility mode of mapstructure
|
|
// which WeakDecodes []interface{}{} into an empty map[string]interface{}. This
|
|
// allows us to use WeakDecode (desirable), but not fail on empty lists.
|
|
func WeakDecode(m interface{}, rawVal interface{}) error {
|
|
config := &mapstructure.DecoderConfig{
|
|
DecodeHook: func(source reflect.Type, target reflect.Type, val interface{}) (interface{}, error) {
|
|
sliceType := reflect.TypeOf(hilMapstructureDecodeHookEmptySlice)
|
|
stringSliceType := reflect.TypeOf(hilMapstructureDecodeHookStringSlice)
|
|
mapType := reflect.TypeOf(hilMapstructureDecodeHookEmptyMap)
|
|
|
|
if (source == sliceType || source == stringSliceType) && target == mapType {
|
|
return nil, fmt.Errorf("Cannot convert a []interface{} into a map[string]interface{}")
|
|
}
|
|
|
|
return val, nil
|
|
},
|
|
WeaklyTypedInput: true,
|
|
Result: rawVal,
|
|
}
|
|
|
|
decoder, err := mapstructure.NewDecoder(config)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return decoder.Decode(m)
|
|
}
|