v2/pkg/genruntime/helpers.go (69 lines of code) (raw):

/* Copyright (c) Microsoft Corporation. Licensed under the MIT license. */ package genruntime import ( "k8s.io/apimachinery/pkg/runtime" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client/apiutil" ) // NewObjectFromExemplar creates a new client.Object with the same GVK as the provided client.Object. // The supplied client.Object is not changed and the returned client.Object is empty. func NewObjectFromExemplar(obj client.Object, scheme *runtime.Scheme) (client.Object, error) { gvk, err := apiutil.GVKForObject(obj, scheme) if err != nil { return nil, err } // Create a fresh destination to deserialize to newObj, err := scheme.New(gvk) if err != nil { return nil, err } // Ensure GVK is populated newObj.GetObjectKind().SetGroupVersionKind(gvk) return newObj.(client.Object), nil } // InterleaveStrSlice interleaves the elements of the two provided slices. The resulting slice looks like: // []{<element 1 from a>, <element 1 from b>, <element 2 from a>, <element 2 from b>...}. If one slice is longer than // the other, the elements are interleaved until the shorter slice is out of elements, at which point all remaining // elements are from the longer slice. func InterleaveStrSlice(a []string, b []string) []string { smallestLen := MinInt(len(a), len(b)) var larger []string if len(a) == smallestLen { larger = b } else { larger = a } var result []string for i := 0; i < smallestLen; i++ { result = append(result, a[i]) result = append(result, b[i]) } result = append(result, larger[smallestLen:]...) return result } // MinInt returns the minimum of the two provided ints. // The fact that this doesn't exist in the Go standard library is depressing. func MinInt(a int, b int) int { if a < b { return a } return b } // ARMSpecNames returns a slice of names from the given ARMResourceSpec slice. func ARMSpecNames(specs []ARMResourceSpec) []string { result := make([]string, len(specs)) for ix := range specs { result[ix] = specs[ix].GetName() } return result } // ARMSpecNames returns a slice of names from the given ARMResourceSpec slice. func RawNames(specs []any) []string { result := make([]string, len(specs)) for ix := range specs { m, ok := specs[ix].(map[string]any) if !ok { result[ix] = "<UNKNOWN>" continue } name, ok := m["name"] if !ok { result[ix] = "<UNKNOWN>" continue } nameStr, ok := name.(string) if !ok { result[ix] = "<UNKNOWN>" continue } result[ix] = nameStr } return result }