defaults.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. package sprig
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "reflect"
  6. "strings"
  7. )
  8. func dfault(d interface{}, given ...interface{}) interface{} {
  9. if empty(given) || empty(given[0]) {
  10. return d
  11. }
  12. return given[0]
  13. }
  14. func empty(given interface{}) bool {
  15. g := reflect.ValueOf(given)
  16. if !g.IsValid() {
  17. return true
  18. }
  19. switch g.Kind() {
  20. default:
  21. return g.IsNil()
  22. case reflect.Array, reflect.Slice, reflect.Map, reflect.String:
  23. return g.Len() == 0
  24. case reflect.Bool:
  25. return !g.Bool()
  26. case reflect.Complex64, reflect.Complex128:
  27. return g.Complex() == 0
  28. case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
  29. return g.Int() == 0
  30. case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
  31. return g.Uint() == 0
  32. case reflect.Float32, reflect.Float64:
  33. return g.Float() == 0
  34. case reflect.Struct:
  35. return false
  36. }
  37. }
  38. func coalesce(v ...interface{}) interface{} {
  39. for _, val := range v {
  40. if !empty(val) {
  41. return val
  42. }
  43. }
  44. return nil
  45. }
  46. func all(v ...interface{}) bool {
  47. for _, val := range v {
  48. if empty(val) {
  49. return false
  50. }
  51. }
  52. return true
  53. }
  54. func any(v ...interface{}) bool {
  55. for _, val := range v {
  56. if !empty(val) {
  57. return true
  58. }
  59. }
  60. return false
  61. }
  62. func fromJson(v string) interface{} {
  63. output, _ := mustFromJson(v)
  64. return output
  65. }
  66. func mustFromJson(v string) (interface{}, error) {
  67. var output interface{}
  68. err := json.Unmarshal([]byte(v), &output)
  69. return output, err
  70. }
  71. func toJson(v interface{}) string {
  72. output, _ := json.Marshal(v)
  73. return string(output)
  74. }
  75. func mustToJson(v interface{}) (string, error) {
  76. output, err := json.Marshal(v)
  77. if err != nil {
  78. return "", err
  79. }
  80. return string(output), nil
  81. }
  82. func toPrettyJson(v interface{}) string {
  83. output, _ := json.MarshalIndent(v, "", " ")
  84. return string(output)
  85. }
  86. func mustToPrettyJson(v interface{}) (string, error) {
  87. output, err := json.MarshalIndent(v, "", " ")
  88. if err != nil {
  89. return "", err
  90. }
  91. return string(output), nil
  92. }
  93. func toRawJson(v interface{}) string {
  94. output, err := mustToRawJson(v)
  95. if err != nil {
  96. panic(err)
  97. }
  98. return string(output)
  99. }
  100. func mustToRawJson(v interface{}) (string, error) {
  101. buf := new(bytes.Buffer)
  102. enc := json.NewEncoder(buf)
  103. enc.SetEscapeHTML(false)
  104. err := enc.Encode(&v)
  105. if err != nil {
  106. return "", err
  107. }
  108. return strings.TrimSuffix(buf.String(), "\n"), nil
  109. }
  110. func ternary(vt interface{}, vf interface{}, v bool) interface{} {
  111. if v {
  112. return vt
  113. }
  114. return vf
  115. }