github.com/codingeasygo/util@v0.0.0-20231206062002-1ce2f004b7d9/xmap/replace.go (about)

     1  package xmap
     2  
     3  import (
     4  	"os"
     5  	"regexp"
     6  	"strings"
     7  
     8  	"github.com/codingeasygo/util/converter"
     9  )
    10  
    11  // ReplaceAll will replace input string by ${xx}, which xx is in values,
    12  // if usingEnv is true, xx will check use env when vals is not having xx,
    13  // if usingEmpty is true, xx will check use empty string when vals is not having xx and env is not exist
    14  func ReplaceAll(vals func(key string) interface{}, in string, usingEnv, usingEmpty bool) (out string) {
    15  	reg := regexp.MustCompile(`\$\{[^\}]*\}`)
    16  	var rval string
    17  	out = reg.ReplaceAllStringFunc(in, func(m string) string {
    18  		keys := strings.Split(strings.Trim(m, "${}\t "), ",")
    19  		for _, key := range keys {
    20  			v := vals(key)
    21  			if v != nil {
    22  				rval = converter.IndirectString(v)
    23  			}
    24  			if len(rval) < 1 && usingEnv {
    25  				rval = os.Getenv(key)
    26  			}
    27  			if len(rval) > 0 {
    28  				break
    29  			}
    30  		}
    31  		if len(rval) > 0 {
    32  			return rval
    33  		}
    34  		if usingEmpty {
    35  			return ""
    36  		}
    37  		return m
    38  	})
    39  	return
    40  }