dict.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. package sprig
  2. func get(d map[string]any, key string) any {
  3. if val, ok := d[key]; ok {
  4. return val
  5. }
  6. return ""
  7. }
  8. func set(d map[string]any, key string, value any) map[string]any {
  9. d[key] = value
  10. return d
  11. }
  12. func unset(d map[string]any, key string) map[string]any {
  13. delete(d, key)
  14. return d
  15. }
  16. func hasKey(d map[string]any, key string) bool {
  17. _, ok := d[key]
  18. return ok
  19. }
  20. func pluck(key string, d ...map[string]any) []any {
  21. var res []any
  22. for _, dict := range d {
  23. if val, ok := dict[key]; ok {
  24. res = append(res, val)
  25. }
  26. }
  27. return res
  28. }
  29. func keys(dicts ...map[string]any) []string {
  30. var k []string
  31. for _, dict := range dicts {
  32. for key := range dict {
  33. k = append(k, key)
  34. }
  35. }
  36. return k
  37. }
  38. func pick(dict map[string]any, keys ...string) map[string]any {
  39. res := map[string]any{}
  40. for _, k := range keys {
  41. if v, ok := dict[k]; ok {
  42. res[k] = v
  43. }
  44. }
  45. return res
  46. }
  47. func omit(dict map[string]any, keys ...string) map[string]any {
  48. res := map[string]any{}
  49. omit := make(map[string]bool, len(keys))
  50. for _, k := range keys {
  51. omit[k] = true
  52. }
  53. for k, v := range dict {
  54. if _, ok := omit[k]; !ok {
  55. res[k] = v
  56. }
  57. }
  58. return res
  59. }
  60. func dict(v ...any) map[string]any {
  61. dict := map[string]any{}
  62. lenv := len(v)
  63. for i := 0; i < lenv; i += 2 {
  64. key := strval(v[i])
  65. if i+1 >= lenv {
  66. dict[key] = ""
  67. continue
  68. }
  69. dict[key] = v[i+1]
  70. }
  71. return dict
  72. }
  73. func values(dict map[string]any) []any {
  74. var values []any
  75. for _, value := range dict {
  76. values = append(values, value)
  77. }
  78. return values
  79. }
  80. func dig(ps ...any) (any, error) {
  81. if len(ps) < 3 {
  82. panic("dig needs at least three arguments")
  83. }
  84. dict := ps[len(ps)-1].(map[string]any)
  85. def := ps[len(ps)-2]
  86. ks := make([]string, len(ps)-2)
  87. for i := 0; i < len(ks); i++ {
  88. ks[i] = ps[i].(string)
  89. }
  90. return digFromDict(dict, def, ks)
  91. }
  92. func digFromDict(dict map[string]any, d any, ks []string) (any, error) {
  93. k, ns := ks[0], ks[1:]
  94. step, has := dict[k]
  95. if !has {
  96. return d, nil
  97. }
  98. if len(ns) == 0 {
  99. return step, nil
  100. }
  101. return digFromDict(step.(map[string]any), d, ns)
  102. }