Skip to content

Commit 212623a

Browse files
committed
refactor: reduce nesting complexity in ToJavaScriptWithSecrets function
Extract helper functions to reduce the nestif complexity from 17 to acceptable levels. - handleSecretVariables: processes secret variables in the buffer - handleRegularVariables: processes regular variables in remaining text - processRegularVariableMatches: processes regex matches for variables - writePlusIfNeeded: writes plus sign if builder has content - writeTextBeforeMatch: writes quoted text before regex match - writeQuotedText: writes text as quoted JavaScript string This refactoring maintains the same functionality while improving code readability and passing golangci-lint nestif complexity checks.
1 parent 2304a80 commit 212623a

File tree

1 file changed

+77
-56
lines changed

1 file changed

+77
-56
lines changed

internal/prober/interpolation/interpolation.go

Lines changed: 77 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -230,24 +230,26 @@ func ToJavaScriptWithSecrets(value string) string {
230230
buf := []byte(value)
231231

232232
// First handle secret variables
233+
p := handleSecretVariables(&s, buf, 0)
234+
235+
// Then handle regular variables in the remaining text
236+
handleRegularVariables(&s, buf[p:])
237+
238+
return s.String()
239+
}
240+
241+
// handleSecretVariables processes secret variables in the buffer and returns the position after the last secret
242+
func handleSecretVariables(s *strings.Builder, buf []byte, startPos int) int {
233243
locs := SecretRegex.FindAllSubmatchIndex(buf, -1)
234-
p := 0
244+
p := startPos
235245

236246
for _, loc := range locs {
237247
if len(loc) < 4 {
238248
panic("unexpected result while building JavaScript")
239249
}
240250

241-
if s.Len() > 0 {
242-
s.WriteRune('+')
243-
}
244-
245-
if pre := buf[p:loc[0]]; len(pre) > 0 {
246-
s.WriteRune('\'')
247-
escapeJavaScript(&s, pre)
248-
s.WriteRune('\'')
249-
s.WriteRune('+')
250-
}
251+
writePlusIfNeeded(s)
252+
writeTextBeforeMatch(s, buf, p, loc[0])
251253

252254
// Generate async secret lookup
253255
s.WriteString(`await secrets.get('`)
@@ -257,60 +259,79 @@ func ToJavaScriptWithSecrets(value string) string {
257259
p = loc[1]
258260
}
259261

260-
// Then handle regular variables in the remaining text
261-
remainingText := buf[p:]
262-
if len(remainingText) > 0 {
263-
regularLocs := VariableRegex.FindAllSubmatchIndex(remainingText, -1)
264-
265-
if len(regularLocs) > 0 {
266-
if s.Len() > 0 {
267-
s.WriteRune('+')
268-
}
262+
// Write any remaining text after secrets
263+
if len(buf[p:]) > 0 {
264+
writePlusIfNeeded(s)
265+
writeQuotedText(s, buf[p:])
266+
}
269267

270-
p2 := 0
271-
for _, loc := range regularLocs {
272-
if len(loc) < 4 {
273-
panic("unexpected result while building JavaScript")
274-
}
268+
return p
269+
}
275270

276-
if s.Len() > 0 {
277-
s.WriteRune('+')
278-
}
271+
// handleRegularVariables processes regular variables in the remaining text
272+
func handleRegularVariables(s *strings.Builder, remainingText []byte) {
273+
if len(remainingText) == 0 {
274+
return
275+
}
279276

280-
if pre := remainingText[p2:loc[0]]; len(pre) > 0 {
281-
s.WriteRune('\'')
282-
escapeJavaScript(&s, pre)
283-
s.WriteRune('\'')
284-
s.WriteRune('+')
285-
}
277+
regularLocs := VariableRegex.FindAllSubmatchIndex(remainingText, -1)
286278

287-
s.WriteString(`vars['`)
288-
s.Write(remainingText[loc[2]:loc[3]])
289-
s.WriteString(`']`)
279+
if len(regularLocs) > 0 {
280+
processRegularVariableMatches(s, remainingText, regularLocs)
281+
} else {
282+
// No regular variables, just append the remaining text
283+
writePlusIfNeeded(s)
284+
writeQuotedText(s, remainingText)
285+
}
286+
}
290287

291-
p2 = loc[1]
292-
}
288+
// processRegularVariableMatches processes the matches found by VariableRegex
289+
func processRegularVariableMatches(s *strings.Builder, remainingText []byte, regularLocs [][]int) {
290+
writePlusIfNeeded(s)
293291

294-
if len(remainingText[p2:]) > 0 {
295-
if s.Len() > 0 {
296-
s.WriteRune('+')
297-
}
298-
s.WriteRune('\'')
299-
escapeJavaScript(&s, remainingText[p2:])
300-
s.WriteRune('\'')
301-
}
302-
} else {
303-
// No regular variables, just append the remaining text
304-
if s.Len() > 0 {
305-
s.WriteRune('+')
306-
}
307-
s.WriteRune('\'')
308-
escapeJavaScript(&s, remainingText)
309-
s.WriteRune('\'')
292+
p2 := 0
293+
for _, loc := range regularLocs {
294+
if len(loc) < 4 {
295+
panic("unexpected result while building JavaScript")
310296
}
297+
298+
writePlusIfNeeded(s)
299+
writeTextBeforeMatch(s, remainingText, p2, loc[0])
300+
301+
s.WriteString(`vars['`)
302+
s.Write(remainingText[loc[2]:loc[3]])
303+
s.WriteString(`']`)
304+
305+
p2 = loc[1]
311306
}
312307

313-
return s.String()
308+
// Write any remaining text after the last variable
309+
if len(remainingText[p2:]) > 0 {
310+
writePlusIfNeeded(s)
311+
writeQuotedText(s, remainingText[p2:])
312+
}
313+
}
314+
315+
// writePlusIfNeeded writes a plus sign if the builder already has content
316+
func writePlusIfNeeded(s *strings.Builder) {
317+
if s.Len() > 0 {
318+
s.WriteRune('+')
319+
}
320+
}
321+
322+
// writeTextBeforeMatch writes the text before a regex match, quoted and escaped
323+
func writeTextBeforeMatch(s *strings.Builder, buf []byte, start, matchStart int) {
324+
if pre := buf[start:matchStart]; len(pre) > 0 {
325+
writeQuotedText(s, pre)
326+
s.WriteRune('+')
327+
}
328+
}
329+
330+
// writeQuotedText writes text as a quoted JavaScript string with proper escaping
331+
func writeQuotedText(s *strings.Builder, text []byte) {
332+
s.WriteRune('\'')
333+
escapeJavaScript(s, text)
334+
s.WriteRune('\'')
314335
}
315336

316337
// escapeJavaScript escapes a byte slice for use in JavaScript strings

0 commit comments

Comments
 (0)