summaryrefslogtreecommitdiff
path: root/pkg/server/env
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/server/env')
-rw-r--r--pkg/server/env/env.go54
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))
}