From 411ef1fd561549a01f5b4dac274d77d51f5c4688 Mon Sep 17 00:00:00 2001 From: Inhere Date: Fri, 17 Mar 2023 23:00:06 +0800 Subject: [PATCH] :sparkles: feat(str/text): replacer support parse env variable --- strutil/textutil/var_replacer.go | 33 ++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/strutil/textutil/var_replacer.go b/strutil/textutil/var_replacer.go index fedc59641..3c5c30a48 100644 --- a/strutil/textutil/var_replacer.go +++ b/strutil/textutil/var_replacer.go @@ -5,6 +5,7 @@ import ( "regexp" "strings" + "github.com/gookit/goutil/internal/comfunc" "github.com/gookit/goutil/maputil" "github.com/gookit/goutil/strutil" ) @@ -16,7 +17,9 @@ type VarReplacer struct { init bool Left, Right string lLen, rLen int - varReg *regexp.Regexp + + parseEnv bool + varReg *regexp.Regexp } // NewVarReplacer instance @@ -24,6 +27,12 @@ func NewVarReplacer(format string) *VarReplacer { return (&VarReplacer{}).WithFormat(format) } +// WithParseEnv custom var template +func (r *VarReplacer) WithParseEnv() *VarReplacer { + r.parseEnv = true + return r +} + // WithFormat custom var template func (r *VarReplacer) WithFormat(format string) *VarReplacer { r.Left, r.Right = strutil.QuietCut(strutil.OrElse(format, defaultVarFormat), ",") @@ -55,7 +64,15 @@ func (r *VarReplacer) Replace(s string, tplVars map[string]any) string { varMap := make(map[string]string, len(tplVars)*2) maputil.FlatWithFunc(tplVars, func(path string, val reflect.Value) { - varMap[path] = strutil.QuietString(val.Interface()) + if val.Kind() == reflect.String { + if r.parseEnv { + varMap[path] = comfunc.ParseEnvVar(val.String(), nil) + } else { + varMap[path] = val.String() + } + } else { + varMap[path] = strutil.QuietString(val.Interface()) + } }) return r.Init().doReplace(s, varMap) @@ -63,10 +80,7 @@ func (r *VarReplacer) Replace(s string, tplVars map[string]any) string { // ReplaceSMap string-map vars in the text contents func (r *VarReplacer) ReplaceSMap(s string, varMap map[string]string) string { - if len(varMap) == 0 || !strings.Contains(s, r.Left) { - return s - } - return r.Init().doReplace(s, varMap) + return r.RenderSimple(s, varMap) } // RenderSimple string-map vars in the text contents. alias of ReplaceSMap() @@ -74,6 +88,13 @@ func (r *VarReplacer) RenderSimple(s string, varMap map[string]string) string { if len(varMap) == 0 || !strings.Contains(s, r.Left) { return s } + + if r.parseEnv { + for name, val := range varMap { + varMap[name] = comfunc.ParseEnvVar(val, nil) + } + } + return r.Init().doReplace(s, varMap) }