Files
strom/proto/smart_convert.go
T
2026-03-11 09:18:58 +01:00

43 lines
891 B
Go

package proto
import (
"reflect"
)
func SmartConvertibleTo(from, to reflect.Type) bool {
switch from.Kind() {
case reflect.Struct:
if from.NumField() != to.NumField() {
return false
}
for i := range from.NumField() {
if !SmartConvertibleTo(from.Field(i).Type, to.Field(i).Type) {
return false
}
}
return true
case reflect.Ptr:
return SmartConvertibleTo(from.Elem(), to.Elem())
default:
return from.ConvertibleTo(to)
}
}
func SmartConvert(from reflect.Value, to reflect.Type) (ret reflect.Value) {
switch from.Kind() {
case reflect.Struct:
ret = reflect.New(to).Elem()
for i := range from.NumField() {
ret.Field(i).Set(SmartConvert(from.Field(i), to.Field(i).Type))
}
return ret
case reflect.Ptr:
if from.IsNil() {
return reflect.Zero(to)
}
return SmartConvert(from.Elem(), to.Elem()).Addr()
default:
return from.Convert(to)
}
}