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 }