summaryrefslogtreecommitdiff
path: root/pkg/server/env.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/server/env.go')
-rw-r--r--pkg/server/env.go105
1 files changed, 105 insertions, 0 deletions
diff --git a/pkg/server/env.go b/pkg/server/env.go
new file mode 100644
index 0000000..769342a
--- /dev/null
+++ b/pkg/server/env.go
@@ -0,0 +1,105 @@
+package server
+
+import (
+ "sync"
+)
+
+func init() {
+ setHandler(envSet, "env", "set")
+ setHandler(envGet, "env", "get")
+ setHandler(envShow, "env", "show")
+ setHandler(envShow, "env", "print")
+ setHandler(envUnset, "env", "unset")
+}
+
+type env struct {
+ m map[string]string
+ sync.Mutex
+}
+
+func (e *env) get(key string) (string, bool) {
+ e.Lock()
+ defer e.Unlock()
+
+ v, ok := e.m[key]
+
+ return v, ok
+}
+
+func (e *env) set(key string, value string) {
+ e.Lock()
+ defer e.Unlock()
+
+ if e.m == nil {
+ e.m = make(map[string]string)
+ }
+
+ e.m[key] = value
+}
+
+func (e *env) unset(key string) bool {
+ e.Lock()
+ defer e.Unlock()
+
+ if e.m == nil {
+ return false
+ }
+
+ if _, ok := e.m[key]; !ok {
+ return false
+ }
+
+ delete(e.m, key)
+
+ return true
+}
+
+func (e *env) each(f func (string, string) bool) {
+ e.Lock()
+ defer e.Unlock()
+
+ for k, v := range e.m {
+ if !f(k, v) {
+ break
+ }
+ }
+}
+
+func envSet(r *request) {
+ r.expect(2)
+
+ r.c.s.env.set(r.args[0], r.args[1])
+}
+
+func envGet(r *request) {
+ r.expect(1)
+
+ if v, ok := r.c.s.env.get(r.args[0]); ok {
+ r.Print(v)
+ } else {
+ r.Print("no such variable")
+ }
+}
+
+func envUnset(r *request) {
+ r.expect(1)
+
+ if !r.c.s.env.unset(r.args[0]) {
+ r.Print("no such variable")
+ }
+}
+
+func envShow(r *request) {
+ r.expect(0, 1)
+
+ switch r.argc {
+ case 0:
+ r.c.s.env.each(func (k string, v string) bool {
+ r.Println(k, v)
+ return true
+ })
+
+ case 1:
+ envGet(r)
+ }
+}