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