package retry import ( "reflect" "github.com/google/go-cmp/cmp" ) func DeepAllowUnexported(vs ...interface{}) cmp.Option { m := make(map[reflect.Type]struct{}) for _, v := range vs { structTypes(reflect.ValueOf(v), m) } var typs []interface{} for t := range m { typs = append(typs, reflect.New(t).Elem().Interface()) } return cmp.AllowUnexported(typs...) } func structTypes(v reflect.Value, m map[reflect.Type]struct{}) { if !v.IsValid() { return } switch v.Kind() { case reflect.Ptr: if !v.IsNil() { structTypes(v.Elem(), m) } case reflect.Interface: if !v.IsNil() { structTypes(v.Elem(), m) } case reflect.Slice, reflect.Array: for i := 0; i < v.Len(); i++ { structTypes(v.Index(i), m) } case reflect.Map: for _, k := range v.MapKeys() { structTypes(v.MapIndex(k), m) } case reflect.Struct: m[v.Type()] = struct{}{} for i := 0; i < v.NumField(); i++ { structTypes(v.Field(i), m) } } }