@@ -26,7 +26,7 @@ import (
2626
2727var delimiter = "\\ $"
2828var substitutionNamed = "[_a-z][_a-z0-9]*"
29- var substitutionBraced = "[_a-z][_a-z0-9]*(?::?[-?][^}]*)?"
29+ var substitutionBraced = "[_a-z][_a-z0-9]*(?::?[-?](.*}| [^}]*) )?"
3030
3131var patternString = fmt .Sprintf (
3232 "%s(?i:(?P<escaped>%s)|(?P<named>%s)|{(?P<braced>%s)}|(?P<invalid>))" ,
@@ -35,14 +35,6 @@ var patternString = fmt.Sprintf(
3535
3636var defaultPattern = regexp .MustCompile (patternString )
3737
38- // DefaultSubstituteFuncs contains the default SubstituteFunc used by the docker cli
39- var DefaultSubstituteFuncs = []SubstituteFunc {
40- softDefault ,
41- hardDefault ,
42- requiredNonEmpty ,
43- required ,
44- }
45-
4638// InvalidTemplateError is returned when a variable template is not in a valid
4739// format
4840type InvalidTemplateError struct {
@@ -67,6 +59,14 @@ type SubstituteFunc func(string, Mapping) (string, bool, error)
6759// SubstituteWith substitute variables in the string with their values.
6860// It accepts additional substitute function.
6961func SubstituteWith (template string , mapping Mapping , pattern * regexp.Regexp , subsFuncs ... SubstituteFunc ) (string , error ) {
62+ if len (subsFuncs ) == 0 {
63+ subsFuncs = []SubstituteFunc {
64+ softDefault ,
65+ hardDefault ,
66+ requiredNonEmpty ,
67+ required ,
68+ }
69+ }
7070 var err error
7171 result := pattern .ReplaceAllStringFunc (template , func (substring string ) string {
7272 matches := pattern .FindStringSubmatch (substring )
@@ -116,7 +116,7 @@ func SubstituteWith(template string, mapping Mapping, pattern *regexp.Regexp, su
116116
117117// Substitute variables in the string with their values
118118func Substitute (template string , mapping Mapping ) (string , error ) {
119- return SubstituteWith (template , mapping , defaultPattern , DefaultSubstituteFuncs ... )
119+ return SubstituteWith (template , mapping , defaultPattern )
120120}
121121
122122// ExtractVariables returns a map of all the variables defined in the specified
@@ -215,6 +215,10 @@ func softDefault(substitution string, mapping Mapping) (string, bool, error) {
215215 return "" , false , nil
216216 }
217217 name , defaultValue := partition (substitution , sep )
218+ defaultValue , err := Substitute (defaultValue , mapping )
219+ if err != nil {
220+ return "" , false , err
221+ }
218222 value , ok := mapping (name )
219223 if ! ok || value == "" {
220224 return defaultValue , true , nil
@@ -229,6 +233,10 @@ func hardDefault(substitution string, mapping Mapping) (string, bool, error) {
229233 return "" , false , nil
230234 }
231235 name , defaultValue := partition (substitution , sep )
236+ defaultValue , err := Substitute (defaultValue , mapping )
237+ if err != nil {
238+ return "" , false , err
239+ }
232240 value , ok := mapping (name )
233241 if ! ok {
234242 return defaultValue , true , nil
@@ -249,6 +257,10 @@ func withRequired(substitution string, mapping Mapping, sep string, valid func(s
249257 return "" , false , nil
250258 }
251259 name , errorMessage := partition (substitution , sep )
260+ errorMessage , err := Substitute (errorMessage , mapping )
261+ if err != nil {
262+ return "" , false , err
263+ }
252264 value , ok := mapping (name )
253265 if ! ok || ! valid (value ) {
254266 return "" , true , & InvalidTemplateError {
0 commit comments