in internal/kubectl.go [185:227]
func (c Kubectl) getFiltered(resource, namespace string, w io.Writer, filter func(object metav1.Object) bool, skipFilter bool) error {
r, err := c.getResources(resource, namespace)
if err != nil {
return err
}
printer, err := printers.NewTypeSetter(scheme.Scheme).WrapToPrinter(&printers.JSONPrinter{}, nil)
if err != nil {
return err
}
obj, err := r.Object()
if err != nil {
return err
}
// If there are no filters, simply return the unfiltered resources.
if skipFilter {
return printer.PrintObj(obj, w)
}
// Otherwise, convert the returned resource to a List, and filter for any matching objects
// using the provided filter func.
var list *corev1.List
list, ok := obj.(*corev1.List)
if !ok {
return fmt.Errorf("while converting returned object (%T) to list", obj)
}
filtered := corev1.List{}
for _, item := range list.Items {
obj, err := meta.Accessor(item.Object)
if err != nil {
return fmt.Errorf("while accessing metadata for %s: %w", item.Object.GetObjectKind().GroupVersionKind().String(), err)
}
if filter(obj) {
filtered.Items = append(filtered.Items, item)
}
}
return printer.PrintObj(&filtered, w)
}