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