From 80f981797a75207382706b6f3d3ddee53b478341 Mon Sep 17 00:00:00 2001 From: Mark Sagi-Kazar Date: Tue, 19 Dec 2023 22:27:02 +0100 Subject: [PATCH] fix: add back weak string slice hook Signed-off-by: Mark Sagi-Kazar --- viper.go | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/viper.go b/viper.go index e18ddde..524027e 100644 --- a/viper.go +++ b/viper.go @@ -1158,7 +1158,8 @@ func defaultDecoderConfig(output any, opts ...DecoderConfigOption) *mapstructure WeaklyTypedInput: true, DecodeHook: mapstructure.ComposeDecodeHookFunc( mapstructure.StringToTimeDurationHookFunc(), - mapstructure.StringToSliceHookFunc(","), + // mapstructure.StringToSliceHookFunc(","), + stringToWeakSliceHookFunc(","), ), } for _, opt := range opts { @@ -1167,6 +1168,28 @@ func defaultDecoderConfig(output any, opts ...DecoderConfigOption) *mapstructure return c } +// As of mapstructure v2.0.0 StringToSliceHookFunc checks if the return type is a string slice. +// This function removes that check. +// TODO: implement a function that checks if the value can be converted to the return type and use it instead. +func stringToWeakSliceHookFunc(sep string) mapstructure.DecodeHookFunc { + return func( + f reflect.Type, + t reflect.Type, + data interface{}, + ) (interface{}, error) { + if f.Kind() != reflect.String || t.Kind() != reflect.Slice { + return data, nil + } + + raw := data.(string) + if raw == "" { + return []string{}, nil + } + + return strings.Split(raw, sep), nil + } +} + // decode is a wrapper around mapstructure.Decode that mimics the WeakDecode functionality. func decode(input any, config *mapstructure.DecoderConfig) error { decoder, err := mapstructure.NewDecoder(config)