1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- package sprig
- import (
- "encoding/json"
- "reflect"
- )
- // dfault checks whether `given` is set, and returns default if not set.
- //
- // This returns `d` if `given` appears not to be set, and `given` otherwise.
- //
- // For numeric types 0 is unset.
- // For strings, maps, arrays, and slices, len() = 0 is considered unset.
- // For bool, false is unset.
- // Structs are never considered unset.
- //
- // For everything else, including pointers, a nil value is unset.
- func dfault(d interface{}, given ...interface{}) interface{} {
- if empty(given) || empty(given[0]) {
- return d
- }
- return given[0]
- }
- // empty returns true if the given value has the zero value for its type.
- func empty(given interface{}) bool {
- g := reflect.ValueOf(given)
- if !g.IsValid() {
- return true
- }
- // Basically adapted from text/template.isTrue
- switch g.Kind() {
- default:
- return g.IsNil()
- case reflect.Array, reflect.Slice, reflect.Map, reflect.String:
- return g.Len() == 0
- case reflect.Bool:
- return g.Bool() == false
- case reflect.Complex64, reflect.Complex128:
- return g.Complex() == 0
- case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
- return g.Int() == 0
- case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
- return g.Uint() == 0
- case reflect.Float32, reflect.Float64:
- return g.Float() == 0
- case reflect.Struct:
- return false
- }
- }
- // coalesce returns the first non-empty value.
- func coalesce(v ...interface{}) interface{} {
- for _, val := range v {
- if !empty(val) {
- return val
- }
- }
- return nil
- }
- // toJson encodes an item into a JSON string
- func toJson(v interface{}) string {
- output, _ := json.Marshal(v)
- return string(output)
- }
- // toPrettyJson encodes an item into a pretty (indented) JSON string
- func toPrettyJson(v interface{}) string {
- output, _ := json.MarshalIndent(v, "", " ")
- return string(output)
- }
- // ternary returns the first value if the last value is true, otherwise returns the second value.
- func ternary(vt interface{}, vf interface{}, v bool) interface{} {
- if v {
- return vt
- }
- return vf
- }
|