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  }