Skip to content

Commit 3e02931

Browse files
committed
Extend default replacement function with applied flag
Signed-off-by: Sven Rebhan <[email protected]>
1 parent 09318c2 commit 3e02931

File tree

2 files changed

+44
-6
lines changed

2 files changed

+44
-6
lines changed

template/template.go

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,11 @@ func SubstituteWithOptions(template string, mapping Mapping, options ...Option)
144144
}
145145

146146
func DefaultReplacementFunc(substring string, mapping Mapping, cfg *Config) (string, error) {
147+
value, _, err := DefaultReplacementAppliedFunc(substring, mapping, cfg)
148+
return value, err
149+
}
150+
151+
func DefaultReplacementAppliedFunc(substring string, mapping Mapping, cfg *Config) (string, bool, error) {
147152
pattern := cfg.pattern
148153
subsFunc := cfg.substituteFunc
149154
if subsFunc == nil {
@@ -160,7 +165,7 @@ func DefaultReplacementFunc(substring string, mapping Mapping, cfg *Config) (str
160165
matches := pattern.FindStringSubmatch(substring)
161166
groups := matchGroups(matches, pattern)
162167
if escaped := groups["escaped"]; escaped != "" {
163-
return escaped, nil
168+
return escaped, true, nil
164169
}
165170

166171
braced := false
@@ -171,20 +176,20 @@ func DefaultReplacementFunc(substring string, mapping Mapping, cfg *Config) (str
171176
}
172177

173178
if substitution == "" {
174-
return "", &InvalidTemplateError{}
179+
return "", false, &InvalidTemplateError{}
175180
}
176181

177182
if braced {
178183
value, applied, err := subsFunc(substitution, mapping)
179184
if err != nil {
180-
return "", err
185+
return "", false, err
181186
}
182187
if applied {
183188
interpolatedNested, err := SubstituteWith(rest, mapping, pattern)
184189
if err != nil {
185-
return "", err
190+
return "", false, err
186191
}
187-
return value + interpolatedNested, nil
192+
return value + interpolatedNested, true, nil
188193
}
189194
}
190195

@@ -193,7 +198,7 @@ func DefaultReplacementFunc(substring string, mapping Mapping, cfg *Config) (str
193198
logrus.Warnf("The %q variable is not set. Defaulting to a blank string.", substitution)
194199
}
195200

196-
return value, nil
201+
return value, ok, nil
197202
}
198203

199204
// SubstituteWith substitute variables in the string with their values.

template/template_test.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -398,6 +398,39 @@ func TestSubstituteWithReplacementFunc(t *testing.T) {
398398
assert.NilError(t, err)
399399
assert.Check(t, is.Equal("ok foobar", result))
400400

401+
result, err = SubstituteWithOptions("ok ${UNSET}", defaultMapping, options...)
402+
assert.NilError(t, err)
403+
assert.Check(t, is.Equal("ok foobar", result))
404+
405+
_, err = SubstituteWithOptions("ok ${NOTHERE}", defaultMapping, options...)
406+
assert.Check(t, is.ErrorContains(err, "bad choice"))
407+
}
408+
409+
func TestSubstituteWithReplacementAppliedFunc(t *testing.T) {
410+
options := []Option{
411+
WithReplacementFunction(func(s string, m Mapping, c *Config) (string, error) {
412+
if s == "${NOTHERE}" {
413+
return "", fmt.Errorf("bad choice: %q", s)
414+
}
415+
r, applied, err := DefaultReplacementAppliedFunc(s, m, c)
416+
if err == nil && applied {
417+
return r, nil
418+
}
419+
return "foobar", nil
420+
}),
421+
}
422+
result, err := SubstituteWithOptions("ok ${FOO}", defaultMapping, options...)
423+
assert.NilError(t, err)
424+
assert.Check(t, is.Equal("ok first", result))
425+
426+
result, err = SubstituteWithOptions("ok ${BAR}", defaultMapping, options...)
427+
assert.NilError(t, err)
428+
assert.Check(t, is.Equal("ok ", result))
429+
430+
result, err = SubstituteWithOptions("ok ${UNSET}", defaultMapping, options...)
431+
assert.NilError(t, err)
432+
assert.Check(t, is.Equal("ok foobar", result))
433+
401434
_, err = SubstituteWithOptions("ok ${NOTHERE}", defaultMapping, options...)
402435
assert.Check(t, is.ErrorContains(err, "bad choice"))
403436
}

0 commit comments

Comments
 (0)