package server import ( "sync" ) func init() { newCmd(envSet, "env", "set") newCmd(envGet, "env", "get") newCmd(envUnset, "env", "unset") newCmd(envShow, "show", "env") } 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.Fatal("no such variable") } } func envUnset(r *request) { r.expect(1) if !r.c.s.env.unset(r.args[0]) { r.Fatal("no such variable") } } func envShow(r *request) { r.expect(0) r.c.s.env.each(func (k string, v string) bool { r.Println(k, v) return true }) }