e2etest/newe2e_generic_wrangling.go (154 lines of code) (raw):

package e2etest import ( "fmt" "reflect" "sync" ) func FirstOrZero[T any](list []T) T { if len(list) != 0 { return list[0] } var zero T return zero } func FirstOrNil[T any](list []T) *T { if len(list) != 0 { return &list[0] } return nil } func SetIfZero[T comparable](target *T, result T) { var zero T if target == nil || *target != zero { return } *target = result } func GetTypeOrZero[T any](in any) (out T) { if out, ok := in.(T); ok { return out } return } func GetTypeOrAssert[T any](a Asserter, in any) (out T) { if out, ok := in.(T); ok { return out } if in != nil { inType := reflect.ValueOf(in).Elem().Type().String() outType := reflect.ValueOf(out).Type().String() a.Error(fmt.Sprintf("in type (%s) is not compatible with out type (%s)", inType, outType)) } return } func DerefOrZero[T any](in *T) (out T) { if in != nil { out = *in } return } func DerefOrDefault[T any](in *T, def T) T { if in != nil { return *in } return def } func PtrOf[T any](in T) (out *T) { return &in } func IsZero[T comparable](in T) bool { var zero T return in == zero } func ListOfAny[T any](in []T) []any { out := make([]any, len(in)) for k, v := range in { out[k] = v } return out } func Keys[K comparable, V any](in map[K]V) []K { out := make([]K, 0, len(in)) for k, _ := range in { out = append(out, k) } return out } func AnyKeys[K comparable, V any](in map[K]V) []any { out := make([]any, 0, len(in)) for k, _ := range in { out = append(out, k) } return out } func CloneMap[K comparable, V any](in map[K]V) map[K]V { out := make(map[K]V) for k, v := range in { out[k] = v } return out } func CloneMapWithRule[K comparable, V any](in map[K]V, rule func(K, V) (key K, value V, include bool)) map[K]V { out := make(map[K]V) for k, v := range in { var include bool k, v, include = rule(k, v) if !include { continue } out[k] = v } return out } func ListContains[I comparable](item I, in []I) bool { for _, v := range in { if item == v { return true } } return false } func Any[I any](items []I, f func(I) bool) bool { for _, v := range items { if f(v) { return true } } return false } func ClonePointer[T any](in *T) *T { if in == nil { return nil } out := *in return &out } func JoinMap[K comparable, V any](in ...map[K]V) map[K]V { out := map[K]V{} for _, dict := range in { for k, v := range dict { out[k] = v } } return out } type RWMutexResource[T any] struct { res T rwmu *sync.RWMutex } func NewRWMutexResource[T any](res T) *RWMutexResource[T] { return &RWMutexResource[T]{ res: res, rwmu: &sync.RWMutex{}, } } func (r *RWMutexResource[T]) DoRead(f func(res T)) { r.rwmu.RLock() defer r.rwmu.RUnlock() f(r.res) } func (r *RWMutexResource[T]) DoWrite(f func(res T)) { r.rwmu.Lock() defer r.rwmu.Unlock() f(r.res) }