dict.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. package sprig
  2. import (
  3. "dario.cat/mergo"
  4. "github.com/mitchellh/copystructure"
  5. )
  6. func get(d map[string]interface{}, key string) interface{} {
  7. if val, ok := d[key]; ok {
  8. return val
  9. }
  10. return ""
  11. }
  12. func set(d map[string]interface{}, key string, value interface{}) map[string]interface{} {
  13. d[key] = value
  14. return d
  15. }
  16. func unset(d map[string]interface{}, key string) map[string]interface{} {
  17. delete(d, key)
  18. return d
  19. }
  20. func hasKey(d map[string]interface{}, key string) bool {
  21. _, ok := d[key]
  22. return ok
  23. }
  24. func pluck(key string, d ...map[string]interface{}) []interface{} {
  25. res := []interface{}{}
  26. for _, dict := range d {
  27. if val, ok := dict[key]; ok {
  28. res = append(res, val)
  29. }
  30. }
  31. return res
  32. }
  33. func keys(dicts ...map[string]interface{}) []string {
  34. k := []string{}
  35. for _, dict := range dicts {
  36. for key := range dict {
  37. k = append(k, key)
  38. }
  39. }
  40. return k
  41. }
  42. func pick(dict map[string]interface{}, keys ...string) map[string]interface{} {
  43. res := map[string]interface{}{}
  44. for _, k := range keys {
  45. if v, ok := dict[k]; ok {
  46. res[k] = v
  47. }
  48. }
  49. return res
  50. }
  51. func omit(dict map[string]interface{}, keys ...string) map[string]interface{} {
  52. res := map[string]interface{}{}
  53. omit := make(map[string]bool, len(keys))
  54. for _, k := range keys {
  55. omit[k] = true
  56. }
  57. for k, v := range dict {
  58. if _, ok := omit[k]; !ok {
  59. res[k] = v
  60. }
  61. }
  62. return res
  63. }
  64. func dict(v ...interface{}) map[string]interface{} {
  65. dict := map[string]interface{}{}
  66. lenv := len(v)
  67. for i := 0; i < lenv; i += 2 {
  68. key := strval(v[i])
  69. if i+1 >= lenv {
  70. dict[key] = ""
  71. continue
  72. }
  73. dict[key] = v[i+1]
  74. }
  75. return dict
  76. }
  77. func merge(dst map[string]interface{}, srcs ...map[string]interface{}) interface{} {
  78. for _, src := range srcs {
  79. if err := mergo.Merge(&dst, src); err != nil {
  80. return ""
  81. }
  82. }
  83. return dst
  84. }
  85. func mustMerge(dst map[string]interface{}, srcs ...map[string]interface{}) (interface{}, error) {
  86. for _, src := range srcs {
  87. if err := mergo.Merge(&dst, src); err != nil {
  88. return nil, err
  89. }
  90. }
  91. return dst, nil
  92. }
  93. func mergeOverwrite(dst map[string]interface{}, srcs ...map[string]interface{}) interface{} {
  94. for _, src := range srcs {
  95. if err := mergo.MergeWithOverwrite(&dst, src); err != nil {
  96. return ""
  97. }
  98. }
  99. return dst
  100. }
  101. func mustMergeOverwrite(dst map[string]interface{}, srcs ...map[string]interface{}) (interface{}, error) {
  102. for _, src := range srcs {
  103. if err := mergo.MergeWithOverwrite(&dst, src); err != nil {
  104. return nil, err
  105. }
  106. }
  107. return dst, nil
  108. }
  109. func values(dict map[string]interface{}) []interface{} {
  110. values := []interface{}{}
  111. for _, value := range dict {
  112. values = append(values, value)
  113. }
  114. return values
  115. }
  116. func deepCopy(i interface{}) interface{} {
  117. c, err := mustDeepCopy(i)
  118. if err != nil {
  119. panic("deepCopy error: " + err.Error())
  120. }
  121. return c
  122. }
  123. func mustDeepCopy(i interface{}) (interface{}, error) {
  124. return copystructure.Copy(i)
  125. }
  126. func dig(ps ...interface{}) (interface{}, error) {
  127. if len(ps) < 3 {
  128. panic("dig needs at least three arguments")
  129. }
  130. dict := ps[len(ps)-1].(map[string]interface{})
  131. def := ps[len(ps)-2]
  132. ks := make([]string, len(ps)-2)
  133. for i := 0; i < len(ks); i++ {
  134. ks[i] = ps[i].(string)
  135. }
  136. return digFromDict(dict, def, ks)
  137. }
  138. func digFromDict(dict map[string]interface{}, d interface{}, ks []string) (interface{}, error) {
  139. k, ns := ks[0], ks[1:len(ks)]
  140. step, has := dict[k]
  141. if !has {
  142. return d, nil
  143. }
  144. if len(ns) == 0 {
  145. return step, nil
  146. }
  147. return digFromDict(step.(map[string]interface{}), d, ns)
  148. }