diff options
Diffstat (limited to 'pkg/server/env')
| -rw-r--r-- | pkg/server/env/env.go | 54 |
1 files changed, 39 insertions, 15 deletions
diff --git a/pkg/server/env/env.go b/pkg/server/env/env.go index 8594e10..98ee231 100644 --- a/pkg/server/env/env.go +++ b/pkg/server/env/env.go @@ -20,7 +20,8 @@ type Env struct { const namePattern = "[a-zA-Z][a-zA-Z0-9.]*" var isGoodName = regexp.MustCompile("^" + namePattern + "$").MatchString -var varRe = regexp.MustCompile("@(" + namePattern + "|{" + namePattern + "})") +var varexpRe = regexp.MustCompile("@(" + namePattern + "|{" + namePattern + "})") +var expandRe = regexp.MustCompile("@[" + namePattern + "]") var errBadVariable = errors.New("bad variable name") var errEmptyVariable = errors.New("empty variable") @@ -67,6 +68,11 @@ func (e Env) Get(key string) string { return v } +func (e Env) Has(key string) bool { + _, ok := e.Find(key) + return ok +} + func (e Env) Set(key string, value string) error { if !isGoodName(key) { return errBadVariable @@ -129,17 +135,9 @@ func (e *env) Clear() { e.m = nil } -func (e Env) Eval(s string) string { - repl := func(v string) string { - key := v[1:] - if key[0] == '{' { - key = key[1 : len(key)-1] - } - return e.Get(key) - } - +func (e Env) replaceWith(r *regexp.Regexp, s string, f func(string) string) string { for { - t := varRe.ReplaceAllStringFunc(s, repl) + t := r.ReplaceAllStringFunc(s, f) if t == s { break @@ -151,10 +149,36 @@ func (e Env) Eval(s string) string { return s } -func (e Env) GetLocal(key string) string { - if v := e.Eval("@{tunnel.@{tunnel}." + key + "}"); v != "" { - return v +func (e Env) Eval(s string) string { + return e.replaceWith(varexpRe, s, func(v string) string { + key := v[1:] + if key[0] == '{' { + key = key[1 : len(key)-1] + } + return e.Get(key) + }) +} + +func (e Env) EvalStrings(s []string) []string { + t := make([]string, len(s)) + for n, v := range s { + t[n] = e.Eval(v) + } + return t +} + +func (e Env) Expand(s string) string { + return e.replaceWith(expandRe, s, func(v string) string { + return e.Get(v[2 : len(v)-1]) + }) +} + +func (e Env) Value(key string) string { + if e.Has("tunnel") { + if v := e.Expand("@[tunnel.@[tunnel]." + key + "]"); v != "" { + return v + } } - return e.Get(key) + return e.Expand(e.Get(key)) } |
