Co-Authored-By: Claude <noreply@anthropic.com> Signed-off-by: Aleksei Sviridkin <f@lex.la>
47 lines
1.1 KiB
Go
47 lines
1.1 KiB
Go
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
// Package sorting provides generic sorting utilities for registry resources.
|
|
package sorting
|
|
|
|
import (
|
|
"slices"
|
|
"strings"
|
|
)
|
|
|
|
// NameGetter is an interface for objects that have a Name.
|
|
type NameGetter interface {
|
|
GetName() string
|
|
}
|
|
|
|
// NamespaceGetter is an interface for objects that have both Name and Namespace.
|
|
type NamespaceGetter interface {
|
|
NameGetter
|
|
GetNamespace() string
|
|
}
|
|
|
|
// ByName sorts a slice of objects by their Name in alphabetical order.
|
|
// Use this for cluster-scoped resources.
|
|
func ByName[T any, PT interface {
|
|
*T
|
|
NameGetter
|
|
}](items []T) {
|
|
slices.SortFunc(items, func(a, b T) int {
|
|
pa, pb := PT(&a), PT(&b)
|
|
return strings.Compare(pa.GetName(), pb.GetName())
|
|
})
|
|
}
|
|
|
|
// ByNamespacedName sorts a slice of objects by Namespace/Name in alphabetical order.
|
|
// Use this for namespace-scoped resources.
|
|
func ByNamespacedName[T any, PT interface {
|
|
*T
|
|
NamespaceGetter
|
|
}](items []T) {
|
|
slices.SortFunc(items, func(a, b T) int {
|
|
pa, pb := PT(&a), PT(&b)
|
|
if res := strings.Compare(pa.GetNamespace(), pb.GetNamespace()); res != 0 {
|
|
return res
|
|
}
|
|
return strings.Compare(pa.GetName(), pb.GetName())
|
|
})
|
|
}
|