func (d *UnstructuredObjectTyper) ObjectKinds(obj runtime.Object) (gvks []schema.GroupVersionKind, unversionedType bool, err error) {
	if _, ok := obj.(runtime.Unstructured); ok {
		gvk := obj.GetObjectKind().GroupVersionKind()
		if len(gvk.Kind) == 0 {
			return nil, false, runtime.NewMissingKindErr("object has no kind field ")
		}
		if len(gvk.Version) == 0 {
			return nil, false, runtime.NewMissingVersionErr("object has no apiVersion field")
		}
		return []schema.GroupVersionKind{gvk}, false, nil
	}
	var lastErr error
	for _, typer := range d.typers {
		gvks, unversioned, err := typer.ObjectKinds(obj)
		if err != nil {
			lastErr = err
			continue
		}
		return gvks, unversioned, nil
	}
	if lastErr == nil {
		lastErr = runtime.NewNotRegisteredErrForType(reflect.TypeOf(obj))
	}
	return nil, false, lastErr
}
ObjectKinds returns a slice of one element with the group,version,kind of the
provided object, or an error if the object is not runtime.Unstructured or
has no group,version,kind information. unversionedType will always be false
because runtime.Unstructured object should always have group,version,kind
information set.
package discovery
import (
	"reflect"
	"k8s.io/apimachinery/pkg/runtime"
	"k8s.io/apimachinery/pkg/runtime/schema"
)
type UnstructuredObjectTyper struct {
	registered map[schema.GroupVersionKind]bool
	typers     []runtime.ObjectTyper
}
func NewUnstructuredObjectTyper(groupResources []*APIGroupResources, typers ...runtime.ObjectTyper) *UnstructuredObjectTyper {
	dot := &UnstructuredObjectTyper{
		registered: make(map[schema.GroupVersionKind]bool),
		typers:     typers,
	}
	for _, group := range groupResources {
		for _, discoveryVersion := range group.Group.Versions {
			resources, ok := group.VersionedResources[discoveryVersion.Version]
			if !ok {
				continue
			}
			gv := schema.GroupVersion{Group: group.Group.Name, Version: discoveryVersion.Version}
			for _, resource := range resources {
				dot.registered[gv.WithKind(resource.Kind)] = true
			}
		}
	}
	return dot
}