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  }