diff options
| author | Mikhail Osipov <mike.osipov@gmail.com> | 2020-01-24 04:05:22 +0300 |
|---|---|---|
| committer | Mikhail Osipov <mikhail.osipov@kaspersky.com> | 2020-01-24 14:15:12 +0300 |
| commit | 774028525cf003e284071685e2b697ad305086e2 (patch) | |
| tree | e6b431082138a79f9dad7dd844adc7c4a3eb7015 /pkg/server/server.go | |
| parent | ab3e3860cbb836203ac707ea395af9902d29ad39 (diff) | |
eval query with env
Diffstat (limited to 'pkg/server/server.go')
| -rw-r--r-- | pkg/server/server.go | 42 |
1 files changed, 32 insertions, 10 deletions
diff --git a/pkg/server/server.go b/pkg/server/server.go index e2515cb..0524216 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -245,22 +245,44 @@ func (r *request) decode(query string) []string { return t } -func (r *request) parse(query string) { - c, args := getCmd(r.decode(query)) - if c == nil { - r.Fatal("command not found") +func (r *request) eval(args []string) []string { + repl := func (v string) string { + if v, ok := r.c.s.env.get(v[1:]); ok { + return v + } + + r.Fatal("unbound variable ", v) + + return v } - for n, s := range args { - if strings.HasPrefix(s, "%") { - if v, ok := r.c.s.env.get(s[1:]); ok { - args[n] = v - } else { - r.Fatal("unbound variable ", s) + eval := func (s string) string { + var t string + + for ;; s = t { + t = varTokenRe.ReplaceAllStringFunc(s, repl) + + if s == t { + return s } } } + for n, s := range args { + args[n] = eval(s) + } + + return args +} + +func (r *request) parse(query string) { + args := r.eval(r.decode(query)) + + c, args := getCmd(args) + if c == nil { + r.Fatal("command not found") + } + r.args = args r.argc = len(args) r.cmd = c |
