-
-
Notifications
You must be signed in to change notification settings - Fork 3
/
sprout.go
308 lines (292 loc) · 13.7 KB
/
sprout.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
package sprout
import (
"log/slog"
"text/template"
)
// ErrHandling defines the strategy for handling errors within FunctionHandler.
// It supports returning default values, panicking, or sending errors to a
// specified channel.
type ErrHandling int
const (
// ErrHandlingReturnDefaultValue indicates that a default value should be
// returned on error (default).
ErrHandlingReturnDefaultValue ErrHandling = iota + 1
// ErrHandlingPanic indicates that a panic should be raised on error.
ErrHandlingPanic
// ErrHandlingErrorChannel indicates that errors should be sent to an error
// channel.
ErrHandlingErrorChannel
)
// FunctionHandler manages function execution with configurable error handling
// and logging.
type FunctionHandler struct {
ErrHandling ErrHandling
errChan chan error
Logger *slog.Logger
funcMap template.FuncMap
funcsAlias FunctionAliasMap
}
// FunctionHandlerOption defines a type for functional options that configure
// FunctionHandler.
type FunctionHandlerOption func(*FunctionHandler)
// NewFunctionHandler creates a new FunctionHandler with the provided options.
func NewFunctionHandler(opts ...FunctionHandlerOption) *FunctionHandler {
fnHandler := &FunctionHandler{
ErrHandling: ErrHandlingReturnDefaultValue,
errChan: make(chan error),
Logger: slog.New(&slog.TextHandler{}),
funcMap: make(template.FuncMap),
funcsAlias: make(FunctionAliasMap),
}
for _, opt := range opts {
opt(fnHandler)
}
return fnHandler
}
// WithErrHandling sets the error handling strategy for a FunctionHandler.
func WithErrHandling(eh ErrHandling) FunctionHandlerOption {
return func(p *FunctionHandler) {
p.ErrHandling = eh
}
}
// WithLogger sets the logger used by a FunctionHandler.
func WithLogger(l *slog.Logger) FunctionHandlerOption {
return func(p *FunctionHandler) {
p.Logger = l
}
}
// WithErrorChannel sets the error channel for a FunctionHandler.
func WithErrorChannel(ec chan error) FunctionHandlerOption {
return func(p *FunctionHandler) {
p.errChan = ec
}
}
// WithFunctionHandler updates a FunctionHandler with settings from another FunctionHandler.
// This is useful for copying configurations between handlers.
func WithFunctionHandler(new *FunctionHandler) FunctionHandlerOption {
return func(fnh *FunctionHandler) {
*fnh = *new
}
}
// FuncMap returns a template.FuncMap for use with text/template or html/template.
// It provides backward compatibility with sprig.FuncMap and integrates
// additional configured functions.
// FOR BACKWARD COMPATIBILITY ONLY
func FuncMap(opts ...FunctionHandlerOption) template.FuncMap {
fnHandler := NewFunctionHandler(opts...)
// Added migrated functions
fnHandler.funcMap["hello"] = fnHandler.Hello
// Added functions not migrated totally yet
fnHandler.funcMap["dateAgo"] = fnHandler.DateAgo
fnHandler.funcMap["date"] = fnHandler.Date
fnHandler.funcMap["dateModify"] = fnHandler.DateModify
fnHandler.funcMap["dateInZone"] = fnHandler.DateInZone
fnHandler.funcMap["duration"] = fnHandler.Duration
fnHandler.funcMap["durationRound"] = fnHandler.DurationRound
fnHandler.funcMap["htmlDate"] = fnHandler.HtmlDate
fnHandler.funcMap["htmlDateInZone"] = fnHandler.HtmlDateInZone
fnHandler.funcMap["mustDateModify"] = fnHandler.MustDateModify
fnHandler.funcMap["mustToDate"] = fnHandler.MustToDate
fnHandler.funcMap["now"] = fnHandler.Now
fnHandler.funcMap["toDate"] = fnHandler.ToDate
fnHandler.funcMap["unixEpoch"] = fnHandler.UnixEpoch
fnHandler.funcMap["ellipsis"] = fnHandler.Ellipsis
fnHandler.funcMap["ellipsisBoth"] = fnHandler.EllipsisBoth
fnHandler.funcMap["toUpper"] = fnHandler.ToUpper
fnHandler.funcMap["toLower"] = fnHandler.ToLower
fnHandler.funcMap["untitle"] = fnHandler.Untitle
fnHandler.funcMap["substr"] = fnHandler.Substring
fnHandler.funcMap["repeat"] = fnHandler.Repeat
fnHandler.funcMap["trunc"] = fnHandler.Trunc
fnHandler.funcMap["trim"] = fnHandler.Trim
fnHandler.funcMap["trimAll"] = fnHandler.TrimAll
fnHandler.funcMap["trimPrefix"] = fnHandler.TrimPrefix
fnHandler.funcMap["trimSuffix"] = fnHandler.TrimSuffix
fnHandler.funcMap["nospace"] = fnHandler.Nospace
fnHandler.funcMap["initials"] = fnHandler.Initials
fnHandler.funcMap["randAlphaNum"] = fnHandler.RandAlphaNumeric
fnHandler.funcMap["randAlpha"] = fnHandler.RandAlpha
fnHandler.funcMap["randAscii"] = fnHandler.RandAscii
fnHandler.funcMap["randNumeric"] = fnHandler.RandNumeric
fnHandler.funcMap["swapCase"] = fnHandler.SwapCase
fnHandler.funcMap["shuffle"] = fnHandler.Shuffle
fnHandler.funcMap["toSnakeCase"] = fnHandler.ToSnakeCase
fnHandler.funcMap["toCamelCase"] = fnHandler.ToCamelCase
fnHandler.funcMap["toKebabCase"] = fnHandler.ToKebabCase
fnHandler.funcMap["toPascalCase"] = fnHandler.ToPascalCase
fnHandler.funcMap["toTitleCase"] = fnHandler.ToTitleCase
fnHandler.funcMap["toDotCase"] = fnHandler.ToDotCase
fnHandler.funcMap["toPathCase"] = fnHandler.ToPathCase
fnHandler.funcMap["toConstantCase"] = fnHandler.ToConstantCase
fnHandler.funcMap["wrap"] = fnHandler.Wrap
fnHandler.funcMap["wrapWith"] = fnHandler.WrapWith
fnHandler.funcMap["contains"] = fnHandler.Contains
fnHandler.funcMap["hasPrefix"] = fnHandler.HasPrefix
fnHandler.funcMap["hasSuffix"] = fnHandler.HasSuffix
fnHandler.funcMap["quote"] = fnHandler.Quote
fnHandler.funcMap["squote"] = fnHandler.Squote
fnHandler.funcMap["cat"] = fnHandler.Cat
fnHandler.funcMap["indent"] = fnHandler.Indent
fnHandler.funcMap["nindent"] = fnHandler.Nindent
fnHandler.funcMap["replace"] = fnHandler.Replace
fnHandler.funcMap["plural"] = fnHandler.Plural
fnHandler.funcMap["sha1sum"] = fnHandler.Sha1sum
fnHandler.funcMap["sha256sum"] = fnHandler.Sha256sum
fnHandler.funcMap["adler32sum"] = fnHandler.Adler32sum
fnHandler.funcMap["toString"] = fnHandler.ToString
fnHandler.funcMap["toInt"] = fnHandler.ToInt
fnHandler.funcMap["toInt64"] = fnHandler.ToInt64
fnHandler.funcMap["toUint"] = fnHandler.ToUint
fnHandler.funcMap["toUint64"] = fnHandler.ToUint64
fnHandler.funcMap["toFloat64"] = fnHandler.ToFloat64
fnHandler.funcMap["toBool"] = fnHandler.ToBool
fnHandler.funcMap["seq"] = fnHandler.Seq
fnHandler.funcMap["toOctal"] = fnHandler.ToOctal
fnHandler.funcMap["toDuration"] = fnHandler.ToDuration
fnHandler.funcMap["split"] = fnHandler.Split
fnHandler.funcMap["splitList"] = fnHandler.SplitList
fnHandler.funcMap["splitn"] = fnHandler.Splitn
fnHandler.funcMap["strSlice"] = fnHandler.StrSlice
fnHandler.funcMap["until"] = fnHandler.Until
fnHandler.funcMap["untilStep"] = fnHandler.UntilStep
fnHandler.funcMap["add1"] = fnHandler.Add1
fnHandler.funcMap["add"] = fnHandler.Add
fnHandler.funcMap["sub"] = fnHandler.Sub
fnHandler.funcMap["div"] = fnHandler.DivInt
fnHandler.funcMap["divf"] = fnHandler.Divf
fnHandler.funcMap["mod"] = fnHandler.Mod
fnHandler.funcMap["mul"] = fnHandler.MulInt
fnHandler.funcMap["mulf"] = fnHandler.Mulf
fnHandler.funcMap["randInt"] = fnHandler.RandInt
fnHandler.funcMap["max"] = fnHandler.Max
fnHandler.funcMap["min"] = fnHandler.Min
fnHandler.funcMap["maxf"] = fnHandler.Maxf
fnHandler.funcMap["minf"] = fnHandler.Minf
fnHandler.funcMap["ceil"] = fnHandler.Ceil
fnHandler.funcMap["floor"] = fnHandler.Floor
fnHandler.funcMap["round"] = fnHandler.Round
fnHandler.funcMap["join"] = fnHandler.Join
fnHandler.funcMap["sortAlpha"] = fnHandler.SortAlpha
fnHandler.funcMap["default"] = fnHandler.Default
fnHandler.funcMap["empty"] = fnHandler.Empty
fnHandler.funcMap["coalesce"] = fnHandler.Coalesce
fnHandler.funcMap["all"] = fnHandler.All
fnHandler.funcMap["any"] = fnHandler.Any
fnHandler.funcMap["compact"] = fnHandler.Compact
fnHandler.funcMap["mustCompact"] = fnHandler.MustCompact
fnHandler.funcMap["fromJson"] = fnHandler.FromJson
fnHandler.funcMap["toJson"] = fnHandler.ToJson
fnHandler.funcMap["toPrettyJson"] = fnHandler.ToPrettyJson
fnHandler.funcMap["toRawJson"] = fnHandler.ToRawJson
fnHandler.funcMap["fromYaml"] = fnHandler.FromYAML
fnHandler.funcMap["toYaml"] = fnHandler.ToYAML
fnHandler.funcMap["mustFromJson"] = fnHandler.MustFromJson
fnHandler.funcMap["mustToJson"] = fnHandler.MustToJson
fnHandler.funcMap["mustToPrettyJson"] = fnHandler.MustToPrettyJson
fnHandler.funcMap["mustToRawJson"] = fnHandler.MustToRawJson
fnHandler.funcMap["mustFromYaml"] = fnHandler.MustFromYAML
fnHandler.funcMap["mustToYaml"] = fnHandler.MustToYAML
fnHandler.funcMap["ternary"] = fnHandler.Ternary
fnHandler.funcMap["deepCopy"] = fnHandler.DeepCopy
fnHandler.funcMap["mustDeepCopy"] = fnHandler.MustDeepCopy
fnHandler.funcMap["typeOf"] = fnHandler.TypeOf
fnHandler.funcMap["typeIs"] = fnHandler.TypeIs
fnHandler.funcMap["typeIsLike"] = fnHandler.TypeIsLike
fnHandler.funcMap["kindOf"] = fnHandler.KindOf
fnHandler.funcMap["kindIs"] = fnHandler.KindIs
fnHandler.funcMap["deepEqual"] = fnHandler.DeepEqual
fnHandler.funcMap["regexMatch"] = fnHandler.RegexMatch
fnHandler.funcMap["mustRegexMatch"] = fnHandler.MustRegexMatch
fnHandler.funcMap["regexFindAll"] = fnHandler.RegexFindAll
fnHandler.funcMap["mustRegexFindAll"] = fnHandler.MustRegexFindAll
fnHandler.funcMap["regexFind"] = fnHandler.RegexFind
fnHandler.funcMap["mustRegexFind"] = fnHandler.MustRegexFind
fnHandler.funcMap["regexReplaceAll"] = fnHandler.RegexReplaceAll
fnHandler.funcMap["mustRegexReplaceAll"] = fnHandler.MustRegexReplaceAll
fnHandler.funcMap["regexReplaceAllLiteral"] = fnHandler.RegexReplaceAllLiteral
fnHandler.funcMap["mustRegexReplaceAllLiteral"] = fnHandler.MustRegexReplaceAllLiteral
fnHandler.funcMap["regexSplit"] = fnHandler.RegexSplit
fnHandler.funcMap["mustRegexSplit"] = fnHandler.MustRegexSplit
fnHandler.funcMap["regexQuoteMeta"] = fnHandler.RegexQuoteMeta
fnHandler.funcMap["append"] = fnHandler.Append
fnHandler.funcMap["mustAppend"] = fnHandler.MustAppend
fnHandler.funcMap["prepend"] = fnHandler.Prepend
fnHandler.funcMap["mustPrepend"] = fnHandler.MustPrepend
fnHandler.funcMap["first"] = fnHandler.First
fnHandler.funcMap["mustFirst"] = fnHandler.MustFirst
fnHandler.funcMap["rest"] = fnHandler.Rest
fnHandler.funcMap["mustRest"] = fnHandler.MustRest
fnHandler.funcMap["last"] = fnHandler.Last
fnHandler.funcMap["mustLast"] = fnHandler.MustLast
fnHandler.funcMap["initial"] = fnHandler.Initial
fnHandler.funcMap["mustInitial"] = fnHandler.MustInitial
fnHandler.funcMap["reverse"] = fnHandler.Reverse
fnHandler.funcMap["mustReverse"] = fnHandler.MustReverse
fnHandler.funcMap["uniq"] = fnHandler.Uniq
fnHandler.funcMap["mustUniq"] = fnHandler.MustUniq
fnHandler.funcMap["without"] = fnHandler.Without
fnHandler.funcMap["mustWithout"] = fnHandler.MustWithout
fnHandler.funcMap["has"] = fnHandler.Has
fnHandler.funcMap["mustHas"] = fnHandler.MustHas
fnHandler.funcMap["slice"] = fnHandler.Slice
fnHandler.funcMap["mustSlice"] = fnHandler.MustSlice
fnHandler.funcMap["concat"] = fnHandler.Concat
fnHandler.funcMap["dig"] = fnHandler.Dig
fnHandler.funcMap["chunk"] = fnHandler.Chunk
fnHandler.funcMap["mustChunk"] = fnHandler.MustChunk
fnHandler.funcMap["list"] = fnHandler.List
fnHandler.funcMap["dict"] = fnHandler.Dict
fnHandler.funcMap["get"] = fnHandler.Get
fnHandler.funcMap["set"] = fnHandler.Set
fnHandler.funcMap["unset"] = fnHandler.Unset
fnHandler.funcMap["hasKey"] = fnHandler.HasKey
fnHandler.funcMap["pluck"] = fnHandler.Pluck
fnHandler.funcMap["keys"] = fnHandler.Keys
fnHandler.funcMap["pick"] = fnHandler.Pick
fnHandler.funcMap["omit"] = fnHandler.Omit
fnHandler.funcMap["merge"] = fnHandler.Merge
fnHandler.funcMap["mergeOverwrite"] = fnHandler.MergeOverwrite
fnHandler.funcMap["mustMerge"] = fnHandler.MustMerge
fnHandler.funcMap["mustMergeOverwrite"] = fnHandler.MustMergeOverwrite
fnHandler.funcMap["values"] = fnHandler.Values
fnHandler.funcMap["bcrypt"] = fnHandler.Bcrypt
fnHandler.funcMap["htpasswd"] = fnHandler.Htpasswd
fnHandler.funcMap["genPrivateKey"] = fnHandler.GeneratePrivateKey
fnHandler.funcMap["derivePassword"] = fnHandler.DerivePassword
fnHandler.funcMap["buildCustomCert"] = fnHandler.BuildCustomCertificate
fnHandler.funcMap["genCA"] = fnHandler.GenerateCertificateAuthority
fnHandler.funcMap["genCAWithKey"] = fnHandler.GenerateCertificateAuthorityWithPEMKey
fnHandler.funcMap["genSelfSignedCert"] = fnHandler.GenerateSelfSignedCertificate
fnHandler.funcMap["genSelfSignedCertWithKey"] = fnHandler.GenerateSelfSignedCertificateWithPEMKey
fnHandler.funcMap["genSignedCert"] = fnHandler.GenerateSignedCertificate
fnHandler.funcMap["genSignedCertWithKey"] = fnHandler.GenerateSignedCertificateWithPEMKey
fnHandler.funcMap["encryptAES"] = fnHandler.EncryptAES
fnHandler.funcMap["decryptAES"] = fnHandler.DecryptAES
fnHandler.funcMap["randBytes"] = fnHandler.RandBytes
fnHandler.funcMap["pathBase"] = fnHandler.PathBase
fnHandler.funcMap["pathDir"] = fnHandler.PathDir
fnHandler.funcMap["pathClean"] = fnHandler.PathClean
fnHandler.funcMap["pathExt"] = fnHandler.PathExt
fnHandler.funcMap["pathIsAbs"] = fnHandler.PathIsAbs
fnHandler.funcMap["osBase"] = fnHandler.OsBase
fnHandler.funcMap["osClean"] = fnHandler.OsClean
fnHandler.funcMap["osDir"] = fnHandler.OsDir
fnHandler.funcMap["osExt"] = fnHandler.OsExt
fnHandler.funcMap["osIsAbs"] = fnHandler.OsIsAbs
fnHandler.funcMap["env"] = fnHandler.Env
fnHandler.funcMap["expandEnv"] = fnHandler.ExpandEnv
fnHandler.funcMap["getHostByName"] = fnHandler.GetHostByName
fnHandler.funcMap["uuidv4"] = fnHandler.Uuidv4
fnHandler.funcMap["semver"] = fnHandler.Semver
fnHandler.funcMap["semverCompare"] = fnHandler.SemverCompare
fnHandler.funcMap["fail"] = fnHandler.Fail
fnHandler.funcMap["urlParse"] = fnHandler.UrlParse
fnHandler.funcMap["urlJoin"] = fnHandler.UrlJoin
fnHandler.funcMap["base64Encode"] = fnHandler.Base64Encode
fnHandler.funcMap["base64Decode"] = fnHandler.Base64Decode
fnHandler.funcMap["base32Encode"] = fnHandler.Base32Encode
fnHandler.funcMap["base32Decode"] = fnHandler.Base32Decode
// Register aliases for functions
fnHandler.registerAliases()
return fnHandler.funcMap
}