github.com/mitchellh/mapstructure will no longer be maintained by the author, and github.com/go-viper/mapstructure is nominated as the endorsed fork. - v1.x changes since last release from mitchellh: https://github.com/go-viper/mapstructure/compare/v1.5.0...v1.6.0 - v2.0 changes: https://github.com/go-viper/mapstructure/compare/v1.6.0...v2.0.0 Breaking changes Error is removed in favor of errors.Join (backported from Go 1.20 to preserve compatibility with earlier versions) What's Changed - feat!: update module path - build: update dev env - feature: add StringToBasicTypeHookFunc and support complex - Add an example showing how to use a DecodeHookFunc to parse a custom field. - Remove exposed error type - Replace internal joined error with errors.Join Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
45 lines
799 B
Go
45 lines
799 B
Go
//go:build !go1.20
|
|
|
|
package mapstructure
|
|
|
|
import "reflect"
|
|
|
|
func isComparable(v reflect.Value) bool {
|
|
k := v.Kind()
|
|
switch k {
|
|
case reflect.Invalid:
|
|
return false
|
|
|
|
case reflect.Array:
|
|
switch v.Type().Elem().Kind() {
|
|
case reflect.Interface, reflect.Array, reflect.Struct:
|
|
for i := 0; i < v.Type().Len(); i++ {
|
|
// if !v.Index(i).Comparable() {
|
|
if !isComparable(v.Index(i)) {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
return v.Type().Comparable()
|
|
|
|
case reflect.Interface:
|
|
// return v.Elem().Comparable()
|
|
return isComparable(v.Elem())
|
|
|
|
case reflect.Struct:
|
|
for i := 0; i < v.NumField(); i++ {
|
|
return false
|
|
|
|
// if !v.Field(i).Comparable() {
|
|
if !isComparable(v.Field(i)) {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
|
|
default:
|
|
return v.Type().Comparable()
|
|
}
|
|
}
|