1 package sprig
2
3 import (
4 "errors"
5 "html/template"
6 "math/rand"
7 "os"
8 "path"
9 "path/filepath"
10 "reflect"
11 "strconv"
12 "strings"
13 ttemplate "text/template"
14 "time"
15 )
16
17
18
19
20
21
22
23 func FuncMap() template.FuncMap {
24 return HtmlFuncMap()
25 }
26
27
28 func HermeticTxtFuncMap() ttemplate.FuncMap {
29 r := TxtFuncMap()
30 for _, name := range nonhermeticFunctions {
31 delete(r, name)
32 }
33 return r
34 }
35
36
37 func HermeticHtmlFuncMap() template.FuncMap {
38 r := HtmlFuncMap()
39 for _, name := range nonhermeticFunctions {
40 delete(r, name)
41 }
42 return r
43 }
44
45
46 func TxtFuncMap() ttemplate.FuncMap {
47 return ttemplate.FuncMap(GenericFuncMap())
48 }
49
50
51 func HtmlFuncMap() template.FuncMap {
52 return template.FuncMap(GenericFuncMap())
53 }
54
55
56 func GenericFuncMap() map[string]interface{} {
57 gfm := make(map[string]interface{}, len(genericMap))
58 for k, v := range genericMap {
59 gfm[k] = v
60 }
61 return gfm
62 }
63
64
65
66 var nonhermeticFunctions = []string{
67
68 "date",
69 "date_in_zone",
70 "date_modify",
71 "now",
72 "htmlDate",
73 "htmlDateInZone",
74 "dateInZone",
75 "dateModify",
76
77
78 "randAlphaNum",
79 "randAlpha",
80 "randAscii",
81 "randNumeric",
82 "randBytes",
83 "uuidv4",
84
85
86 "env",
87 "expandenv",
88
89
90 "getHostByName",
91 }
92
93 var genericMap = map[string]interface{}{
94 "hello": func() string { return "Hello!" },
95
96
97 "ago": dateAgo,
98 "date": date,
99 "date_in_zone": dateInZone,
100 "date_modify": dateModify,
101 "dateInZone": dateInZone,
102 "dateModify": dateModify,
103 "duration": duration,
104 "durationRound": durationRound,
105 "htmlDate": htmlDate,
106 "htmlDateInZone": htmlDateInZone,
107 "must_date_modify": mustDateModify,
108 "mustDateModify": mustDateModify,
109 "mustToDate": mustToDate,
110 "now": time.Now,
111 "toDate": toDate,
112 "unixEpoch": unixEpoch,
113
114
115 "trunc": trunc,
116 "trim": strings.TrimSpace,
117 "upper": strings.ToUpper,
118 "lower": strings.ToLower,
119 "title": strings.Title,
120 "substr": substring,
121
122 "repeat": func(count int, str string) string { return strings.Repeat(str, count) },
123
124 "trimall": func(a, b string) string { return strings.Trim(b, a) },
125
126 "trimAll": func(a, b string) string { return strings.Trim(b, a) },
127 "trimSuffix": func(a, b string) string { return strings.TrimSuffix(b, a) },
128 "trimPrefix": func(a, b string) string { return strings.TrimPrefix(b, a) },
129
130 "contains": func(substr string, str string) bool { return strings.Contains(str, substr) },
131 "hasPrefix": func(substr string, str string) bool { return strings.HasPrefix(str, substr) },
132 "hasSuffix": func(substr string, str string) bool { return strings.HasSuffix(str, substr) },
133 "quote": quote,
134 "squote": squote,
135 "cat": cat,
136 "indent": indent,
137 "nindent": nindent,
138 "replace": replace,
139 "plural": plural,
140 "sha1sum": sha1sum,
141 "sha256sum": sha256sum,
142 "adler32sum": adler32sum,
143 "toString": strval,
144
145
146 "atoi": func(a string) int { i, _ := strconv.Atoi(a); return i },
147 "int64": toInt64,
148 "int": toInt,
149 "float64": toFloat64,
150 "seq": seq,
151 "toDecimal": toDecimal,
152
153
154
155
156
157
158
159 "split": split,
160 "splitList": func(sep, orig string) []string { return strings.Split(orig, sep) },
161
162 "splitn": splitn,
163 "toStrings": strslice,
164
165 "until": until,
166 "untilStep": untilStep,
167
168
169 "add1": func(i interface{}) int64 { return toInt64(i) + 1 },
170 "add": func(i ...interface{}) int64 {
171 var a int64 = 0
172 for _, b := range i {
173 a += toInt64(b)
174 }
175 return a
176 },
177 "sub": func(a, b interface{}) int64 { return toInt64(a) - toInt64(b) },
178 "div": func(a, b interface{}) int64 { return toInt64(a) / toInt64(b) },
179 "mod": func(a, b interface{}) int64 { return toInt64(a) % toInt64(b) },
180 "mul": func(a interface{}, v ...interface{}) int64 {
181 val := toInt64(a)
182 for _, b := range v {
183 val = val * toInt64(b)
184 }
185 return val
186 },
187 "randInt": func(min, max int) int { return rand.Intn(max-min) + min },
188 "biggest": max,
189 "max": max,
190 "min": min,
191 "maxf": maxf,
192 "minf": minf,
193 "ceil": ceil,
194 "floor": floor,
195 "round": round,
196
197
198
199 "join": join,
200 "sortAlpha": sortAlpha,
201
202
203 "default": dfault,
204 "empty": empty,
205 "coalesce": coalesce,
206 "all": all,
207 "any": any,
208 "compact": compact,
209 "mustCompact": mustCompact,
210 "fromJson": fromJson,
211 "toJson": toJson,
212 "toPrettyJson": toPrettyJson,
213 "toRawJson": toRawJson,
214 "mustFromJson": mustFromJson,
215 "mustToJson": mustToJson,
216 "mustToPrettyJson": mustToPrettyJson,
217 "mustToRawJson": mustToRawJson,
218 "ternary": ternary,
219
220
221 "typeOf": typeOf,
222 "typeIs": typeIs,
223 "typeIsLike": typeIsLike,
224 "kindOf": kindOf,
225 "kindIs": kindIs,
226 "deepEqual": reflect.DeepEqual,
227
228
229 "env": os.Getenv,
230 "expandenv": os.ExpandEnv,
231
232
233 "getHostByName": getHostByName,
234
235
236 "base": path.Base,
237 "dir": path.Dir,
238 "clean": path.Clean,
239 "ext": path.Ext,
240 "isAbs": path.IsAbs,
241
242
243 "osBase": filepath.Base,
244 "osClean": filepath.Clean,
245 "osDir": filepath.Dir,
246 "osExt": filepath.Ext,
247 "osIsAbs": filepath.IsAbs,
248
249
250 "b64enc": base64encode,
251 "b64dec": base64decode,
252 "b32enc": base32encode,
253 "b32dec": base32decode,
254
255
256 "tuple": list,
257 "list": list,
258 "dict": dict,
259 "get": get,
260 "set": set,
261 "unset": unset,
262 "hasKey": hasKey,
263 "pluck": pluck,
264 "keys": keys,
265 "pick": pick,
266 "omit": omit,
267 "values": values,
268
269 "append": push, "push": push,
270 "mustAppend": mustPush, "mustPush": mustPush,
271 "prepend": prepend,
272 "mustPrepend": mustPrepend,
273 "first": first,
274 "mustFirst": mustFirst,
275 "rest": rest,
276 "mustRest": mustRest,
277 "last": last,
278 "mustLast": mustLast,
279 "initial": initial,
280 "mustInitial": mustInitial,
281 "reverse": reverse,
282 "mustReverse": mustReverse,
283 "uniq": uniq,
284 "mustUniq": mustUniq,
285 "without": without,
286 "mustWithout": mustWithout,
287 "has": has,
288 "mustHas": mustHas,
289 "slice": slice,
290 "mustSlice": mustSlice,
291 "concat": concat,
292 "dig": dig,
293 "chunk": chunk,
294 "mustChunk": mustChunk,
295
296
297 "fail": func(msg string) (string, error) { return "", errors.New(msg) },
298
299
300 "regexMatch": regexMatch,
301 "mustRegexMatch": mustRegexMatch,
302 "regexFindAll": regexFindAll,
303 "mustRegexFindAll": mustRegexFindAll,
304 "regexFind": regexFind,
305 "mustRegexFind": mustRegexFind,
306 "regexReplaceAll": regexReplaceAll,
307 "mustRegexReplaceAll": mustRegexReplaceAll,
308 "regexReplaceAllLiteral": regexReplaceAllLiteral,
309 "mustRegexReplaceAllLiteral": mustRegexReplaceAllLiteral,
310 "regexSplit": regexSplit,
311 "mustRegexSplit": mustRegexSplit,
312 "regexQuoteMeta": regexQuoteMeta,
313
314
315 "urlParse": urlParse,
316 "urlJoin": urlJoin,
317 }
318
View as plain text