// ResourceSingularizer implements RESTMapper // It converts a resource name from plural to singular (e.g., from pods to pod) func (m *DefaultRESTMapper) ResourceSingularizer(resourceType string) (string, error) { partialResource := unversioned.GroupVersionResource{Resource: resourceType} resources, err := m.ResourcesFor(partialResource) if err != nil { return resourceType, err } singular := unversioned.GroupVersionResource{} for _, curr := range resources { currSingular, ok := m.pluralToSingular[curr] if !ok { continue } if singular.Empty() { singular = currSingular continue } if currSingular.Resource != singular.Resource { return resourceType, fmt.Errorf("multiple possible singular resources (%v) found for %v", resources, resourceType) } } if singular.Empty() { return resourceType, fmt.Errorf("no singular of resource %v has been defined", resourceType) } return singular.Resource, nil }
func resourceFor(mapper meta.RESTMapper, resourceArg string) unversioned.GroupVersionResource { fullySpecifiedGVR, groupResource := unversioned.ParseResourceArg(strings.ToLower(resourceArg)) gvr := unversioned.GroupVersionResource{} if fullySpecifiedGVR != nil { gvr, _ = mapper.ResourceFor(*fullySpecifiedGVR) } if gvr.Empty() { var err error gvr, err = mapper.ResourceFor(groupResource.WithVersion("")) if err != nil { return unversioned.GroupVersionResource{Resource: resourceArg} } } return gvr }