github.com/maresnic/mr-kong@v1.0.0/interpolate.go (about) 1 package kong 2 3 import ( 4 "fmt" 5 "regexp" 6 ) 7 8 var interpolationRegex = regexp.MustCompile(`(\$\$)|((?:\${([[:alpha:]_][[:word:]]*))(?:=([^}]+))?})|(\$)|([^$]+)`) 9 10 // HasInterpolatedVar returns true if the variable "v" is interpolated in "s". 11 func HasInterpolatedVar(s string, v string) bool { 12 matches := interpolationRegex.FindAllStringSubmatch(s, -1) 13 for _, match := range matches { 14 if name := match[3]; name == v { 15 return true 16 } 17 } 18 return false 19 } 20 21 // Interpolate variables from vars into s for substrings in the form ${var} or ${var=default}. 22 func interpolate(s string, vars Vars, updatedVars map[string]string) (string, error) { 23 out := "" 24 matches := interpolationRegex.FindAllStringSubmatch(s, -1) 25 if len(matches) == 0 { 26 return s, nil 27 } 28 for key, val := range updatedVars { 29 if vars[key] != val { 30 vars = vars.CloneWith(updatedVars) 31 break 32 } 33 } 34 for _, match := range matches { 35 if dollar := match[1]; dollar != "" { 36 out += "$" 37 } else if name := match[3]; name != "" { 38 value, ok := vars[name] 39 if !ok { 40 // No default value. 41 if match[4] == "" { 42 return "", fmt.Errorf("undefined variable ${%s}", name) 43 } 44 value = match[4] 45 } 46 out += value 47 } else { 48 out += match[0] 49 } 50 } 51 return out, nil 52 }