Add k8s ptr
This commit is contained in:
73 pkg/ptr/ptr.go Normal file
73
pkg/ptr/ptr.go Normal file @@ -0,0 +1,73 @@ | ||||
/* | ||||
Copyright 2023 The Kubernetes Authors. | ||||
| ||||
Licensed under the Apache License, Version 2.0 (the "License"); | ||||
you may not use this file except in compliance with the License. | ||||
You may obtain a copy of the License at | ||||
| ||||
http://www.apache.org/licenses/LICENSE-2.0 | ||||
| ||||
Unless required by applicable law or agreed to in writing, software | ||||
distributed under the License is distributed on an "AS IS" BASIS, | ||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
See the License for the specific language governing permissions and | ||||
limitations under the License. | ||||
*/ | ||||
| ||||
package ptr | ||||
| ||||
import ( | ||||
"fmt" | ||||
"reflect" | ||||
) | ||||
| ||||
// AllPtrFieldsNil tests whether all pointer fields in a struct are nil. This is useful when, | ||||
// for example, an API struct is handled by plugins which need to distinguish | ||||
// "no plugin accepted this spec" from "this spec is empty". | ||||
// | ||||
// This function is only valid for structs and pointers to structs. Any other | ||||
// type will cause a panic. Passing a typed nil pointer will return true. | ||||
func AllPtrFieldsNil(obj interface{}) bool { | ||||
v := reflect.ValueOf(obj) | ||||
if !v.IsValid() { | ||||
panic(fmt.Sprintf("reflect.ValueOf() produced a non-valid Value for %#v", obj)) | ||||
} | ||||
if v.Kind() == reflect.Ptr { | ||||
if v.IsNil() { | ||||
return true | ||||
} | ||||
v = v.Elem() | ||||
} | ||||
for i := 0; i < v.NumField(); i++ { | ||||
if v.Field(i).Kind() == reflect.Ptr && !v.Field(i).IsNil() { | ||||
return false | ||||
} | ||||
} | ||||
return true | ||||
} | ||||
| ||||
// To returns a pointer to the given value. | ||||
func To[T any](v T) *T { | ||||
return &v | ||||
} | ||||
| ||||
// Deref dereferences ptr and returns the value it points to if no nil, or else | ||||
// returns def. | ||||
func Deref[T any](ptr *T, def T) T { | ||||
if ptr != nil { | ||||
return *ptr | ||||
} | ||||
return def | ||||
} | ||||
| ||||
// Equal returns true if both arguments are nil or both arguments | ||||
// dereference to the same value. | ||||
func Equal[T comparable](a, b *T) bool { | ||||
if (a == nil) != (b == nil) { | ||||
return false | ||||
} | ||||
if a == nil { | ||||
return true | ||||
} | ||||
return *a == *b | ||||
} |
Reference in New Issue
Block a user