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
 | 
						|
}
 |