github.com/coveo/gotemplate@v2.7.7+incompatible/collections/utils.go (about) 1 package collections 2 3 import "reflect" 4 5 // IsEmptyValue determines if a value is a zero value 6 func IsEmptyValue(v reflect.Value) bool { 7 switch v.Kind() { 8 case reflect.Array, reflect.Map, reflect.Slice, reflect.String: 9 return v.Len() == 0 10 case reflect.Bool: 11 return !v.Bool() 12 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: 13 return v.Int() == 0 14 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: 15 return v.Uint() == 0 16 case reflect.Float32, reflect.Float64: 17 return v.Float() == 0 18 case reflect.Interface, reflect.Ptr: 19 return v.IsNil() 20 case reflect.Invalid: 21 return true 22 } 23 return false 24 } 25 26 // IfUndef returns default value if nothing is supplied as values 27 func IfUndef(def interface{}, values ...interface{}) interface{} { 28 switch len(values) { 29 case 0: 30 return def 31 case 1: 32 if values[0] == nil || reflect.TypeOf(values[0]).Kind() == reflect.Ptr && IsEmptyValue(reflect.ValueOf(values[0])) { 33 return def 34 } 35 return values[0] 36 default: 37 return values 38 } 39 } 40 41 // IIf acts as a generic ternary operator. It returns valueTrue if testValue is not empty, 42 // otherwise, it returns valueFalse 43 func IIf(testValue, valueTrue, valueFalse interface{}) interface{} { 44 if IsEmptyValue(reflect.ValueOf(testValue)) { 45 return valueFalse 46 } 47 return valueTrue 48 } 49 50 // Default returns the value if it is not empty or default value. 51 func Default(value, defaultValue interface{}) interface{} { 52 return IIf(value, value, defaultValue) 53 }