Fix SmartConver for slices
This commit is contained in:
+16
-4
@@ -14,6 +14,9 @@ import (
|
|||||||
func SmartConvertibleTo(from, to reflect.Type) bool {
|
func SmartConvertibleTo(from, to reflect.Type) bool {
|
||||||
switch from.Kind() {
|
switch from.Kind() {
|
||||||
case reflect.Struct:
|
case reflect.Struct:
|
||||||
|
if to.Kind() != reflect.Struct {
|
||||||
|
return false
|
||||||
|
}
|
||||||
if from.NumField() != to.NumField() {
|
if from.NumField() != to.NumField() {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
@@ -23,7 +26,10 @@ func SmartConvertibleTo(from, to reflect.Type) bool {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
case reflect.Ptr:
|
case reflect.Pointer, reflect.Slice:
|
||||||
|
if from.Kind() != to.Kind() {
|
||||||
|
return false
|
||||||
|
}
|
||||||
return SmartConvertibleTo(from.Elem(), to.Elem())
|
return SmartConvertibleTo(from.Elem(), to.Elem())
|
||||||
default:
|
default:
|
||||||
return from.ConvertibleTo(to)
|
return from.ConvertibleTo(to)
|
||||||
@@ -37,15 +43,21 @@ func SmartConvert(from reflect.Value, to reflect.Type) (ret reflect.Value) {
|
|||||||
for i := range from.NumField() {
|
for i := range from.NumField() {
|
||||||
ret.Field(i).Set(SmartConvert(from.Field(i), to.Field(i).Type))
|
ret.Field(i).Set(SmartConvert(from.Field(i), to.Field(i).Type))
|
||||||
}
|
}
|
||||||
return ret
|
case reflect.Pointer:
|
||||||
case reflect.Ptr:
|
|
||||||
if from.IsNil() {
|
if from.IsNil() {
|
||||||
return reflect.Zero(to)
|
return reflect.Zero(to)
|
||||||
}
|
}
|
||||||
return SmartConvert(from.Elem(), to.Elem()).Addr()
|
ret = SmartConvert(from.Elem(), to.Elem()).Addr()
|
||||||
|
case reflect.Slice:
|
||||||
|
l := from.Len()
|
||||||
|
ret = reflect.MakeSlice(to, l, l)
|
||||||
|
for i := range l {
|
||||||
|
ret.Index(i).Set(SmartConvert(from.Index(i), to.Elem()))
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
return from.Convert(to)
|
return from.Convert(to)
|
||||||
}
|
}
|
||||||
|
return ret
|
||||||
}
|
}
|
||||||
|
|
||||||
// RegisterUntilLatest registers a handler for all versions between the passed in packet version and the latest supported version.
|
// RegisterUntilLatest registers a handler for all versions between the passed in packet version and the latest supported version.
|
||||||
|
|||||||
@@ -18,3 +18,14 @@ func TestCanSmartConvert(t *testing.T) {
|
|||||||
ret := proto.SmartConvert(reflect.ValueOf(packet), reflect.TypeFor[*v1_21_8.PlayToClientPacketPosition]())
|
ret := proto.SmartConvert(reflect.ValueOf(packet), reflect.TypeFor[*v1_21_8.PlayToClientPacketPosition]())
|
||||||
t.Logf("%#v", ret)
|
t.Logf("%#v", ret)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestCanSmartConvertTags(t *testing.T) {
|
||||||
|
packet := &v1_21_9.ConfigurationToClientPacketTags{}
|
||||||
|
targetType := reflect.TypeFor[*v1_21_8.ConfigurationToClientPacketTags]()
|
||||||
|
can := proto.SmartConvertibleTo(reflect.TypeOf(packet), targetType)
|
||||||
|
if !can {
|
||||||
|
t.Fatal("can't smart convert")
|
||||||
|
}
|
||||||
|
ret := proto.SmartConvert(reflect.ValueOf(packet), targetType)
|
||||||
|
t.Logf("%#v", ret)
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user