github.com/artisanhe/tools@v1.0.1-0.20210607022958-19a8fef2eb04/executil/env_var.go (about)

     1  package executil
     2  
     3  import (
     4  	"os"
     5  	"regexp"
     6  	"strings"
     7  
     8  	"github.com/sirupsen/logrus"
     9  )
    10  
    11  var reEnvVar = regexp.MustCompile("(\\$?\\$)\\{?([A-Z0-9_]+)\\}?")
    12  
    13  type EnvVars map[string]string
    14  
    15  func (envVars EnvVars) AddEnvVar(key, value string) {
    16  	envVars[key] = value
    17  }
    18  
    19  func (envVars EnvVars) LoadFromEnviron() {
    20  	for _, keyPair := range os.Environ() {
    21  		keyValue := strings.Split(keyPair, "=")
    22  		envVars.AddEnvVar(keyValue[0], keyValue[1])
    23  	}
    24  }
    25  
    26  func (envVars EnvVars) Parse(s string) string {
    27  	result := reEnvVar.ReplaceAllStringFunc(s, func(str string) string {
    28  		matched := reEnvVar.FindAllStringSubmatch(str, -1)[0]
    29  
    30  		// skip $${ }
    31  		if matched[1] == "$$" {
    32  			return "${" + matched[2] + "}"
    33  		}
    34  
    35  		if value, ok := envVars[matched[2]]; ok {
    36  			return value
    37  		}
    38  
    39  		logrus.Errorf("Missing environment variable ${%s}", matched[2])
    40  		return "${" + matched[2] + "}"
    41  	})
    42  
    43  	return result
    44  }