31 lines
669 B
Go
31 lines
669 B
Go
|
package api
|
||
|
|
||
|
import "reflect"
|
||
|
|
||
|
var _internalField = "Internal"
|
||
|
|
||
|
// GetInternalStructs extracts all pointers to 'Internal' sub-structs from the provided pointer to a proxy struct
|
||
|
func GetInternalStructs(in interface{}) []interface{} {
|
||
|
return getInternalStructs(reflect.ValueOf(in).Elem())
|
||
|
}
|
||
|
|
||
|
func getInternalStructs(rv reflect.Value) []interface{} {
|
||
|
var out []interface{}
|
||
|
|
||
|
internal := rv.FieldByName(_internalField)
|
||
|
ii := internal.Addr().Interface()
|
||
|
out = append(out, ii)
|
||
|
|
||
|
for i := 0; i < rv.NumField(); i++ {
|
||
|
if rv.Type().Field(i).Name == _internalField {
|
||
|
continue
|
||
|
}
|
||
|
|
||
|
sub := getInternalStructs(rv.Field(i))
|
||
|
|
||
|
out = append(out, sub...)
|
||
|
}
|
||
|
|
||
|
return out
|
||
|
}
|