diff options
| author | Mikhail Osipov <mike.osipov@gmail.com> | 2020-01-22 04:32:26 +0300 |
|---|---|---|
| committer | Mikhail Osipov <mike.osipov@gmail.com> | 2020-01-22 12:12:51 +0300 |
| commit | ffb4c8b5c2641ae9ee845ddd7f7031c1111a6d45 (patch) | |
| tree | a6459e5237841edc30e43b815b1b012aa27741b5 /pkg/server/env.go | |
| parent | dc51320e96e82f574b629563dbcce65607d80483 (diff) | |
add chain and env commands
Diffstat (limited to 'pkg/server/env.go')
| -rw-r--r-- | pkg/server/env.go | 105 |
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) + } +} |
