podman

Форк
0
174 строки · 3.5 Кб
1
package sprig
2

3
import (
4
	"github.com/imdario/mergo"
5
	"github.com/mitchellh/copystructure"
6
)
7

8
func get(d map[string]interface{}, key string) interface{} {
9
	if val, ok := d[key]; ok {
10
		return val
11
	}
12
	return ""
13
}
14

15
func set(d map[string]interface{}, key string, value interface{}) map[string]interface{} {
16
	d[key] = value
17
	return d
18
}
19

20
func unset(d map[string]interface{}, key string) map[string]interface{} {
21
	delete(d, key)
22
	return d
23
}
24

25
func hasKey(d map[string]interface{}, key string) bool {
26
	_, ok := d[key]
27
	return ok
28
}
29

30
func pluck(key string, d ...map[string]interface{}) []interface{} {
31
	res := []interface{}{}
32
	for _, dict := range d {
33
		if val, ok := dict[key]; ok {
34
			res = append(res, val)
35
		}
36
	}
37
	return res
38
}
39

40
func keys(dicts ...map[string]interface{}) []string {
41
	k := []string{}
42
	for _, dict := range dicts {
43
		for key := range dict {
44
			k = append(k, key)
45
		}
46
	}
47
	return k
48
}
49

50
func pick(dict map[string]interface{}, keys ...string) map[string]interface{} {
51
	res := map[string]interface{}{}
52
	for _, k := range keys {
53
		if v, ok := dict[k]; ok {
54
			res[k] = v
55
		}
56
	}
57
	return res
58
}
59

60
func omit(dict map[string]interface{}, keys ...string) map[string]interface{} {
61
	res := map[string]interface{}{}
62

63
	omit := make(map[string]bool, len(keys))
64
	for _, k := range keys {
65
		omit[k] = true
66
	}
67

68
	for k, v := range dict {
69
		if _, ok := omit[k]; !ok {
70
			res[k] = v
71
		}
72
	}
73
	return res
74
}
75

76
func dict(v ...interface{}) map[string]interface{} {
77
	dict := map[string]interface{}{}
78
	lenv := len(v)
79
	for i := 0; i < lenv; i += 2 {
80
		key := strval(v[i])
81
		if i+1 >= lenv {
82
			dict[key] = ""
83
			continue
84
		}
85
		dict[key] = v[i+1]
86
	}
87
	return dict
88
}
89

90
func merge(dst map[string]interface{}, srcs ...map[string]interface{}) interface{} {
91
	for _, src := range srcs {
92
		if err := mergo.Merge(&dst, src); err != nil {
93
			// Swallow errors inside of a template.
94
			return ""
95
		}
96
	}
97
	return dst
98
}
99

100
func mustMerge(dst map[string]interface{}, srcs ...map[string]interface{}) (interface{}, error) {
101
	for _, src := range srcs {
102
		if err := mergo.Merge(&dst, src); err != nil {
103
			return nil, err
104
		}
105
	}
106
	return dst, nil
107
}
108

109
func mergeOverwrite(dst map[string]interface{}, srcs ...map[string]interface{}) interface{} {
110
	for _, src := range srcs {
111
		if err := mergo.MergeWithOverwrite(&dst, src); err != nil {
112
			// Swallow errors inside of a template.
113
			return ""
114
		}
115
	}
116
	return dst
117
}
118

119
func mustMergeOverwrite(dst map[string]interface{}, srcs ...map[string]interface{}) (interface{}, error) {
120
	for _, src := range srcs {
121
		if err := mergo.MergeWithOverwrite(&dst, src); err != nil {
122
			return nil, err
123
		}
124
	}
125
	return dst, nil
126
}
127

128
func values(dict map[string]interface{}) []interface{} {
129
	values := []interface{}{}
130
	for _, value := range dict {
131
		values = append(values, value)
132
	}
133

134
	return values
135
}
136

137
func deepCopy(i interface{}) interface{} {
138
	c, err := mustDeepCopy(i)
139
	if err != nil {
140
		panic("deepCopy error: " + err.Error())
141
	}
142

143
	return c
144
}
145

146
func mustDeepCopy(i interface{}) (interface{}, error) {
147
	return copystructure.Copy(i)
148
}
149

150
func dig(ps ...interface{}) (interface{}, error) {
151
	if len(ps) < 3 {
152
		panic("dig needs at least three arguments")
153
	}
154
	dict := ps[len(ps)-1].(map[string]interface{})
155
	def := ps[len(ps)-2]
156
	ks := make([]string, len(ps)-2)
157
	for i := 0; i < len(ks); i++ {
158
		ks[i] = ps[i].(string)
159
	}
160

161
	return digFromDict(dict, def, ks)
162
}
163

164
func digFromDict(dict map[string]interface{}, d interface{}, ks []string) (interface{}, error) {
165
	k, ns := ks[0], ks[1:len(ks)]
166
	step, has := dict[k]
167
	if !has {
168
		return d, nil
169
	}
170
	if len(ns) == 0 {
171
		return step, nil
172
	}
173
	return digFromDict(step.(map[string]interface{}), d, ns)
174
}
175

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.