github.com/neugram/ng@v0.0.0-20180309130942-d472ff93d872/eval/environ/environ.go (about) 1 // Copyright 2016 The Neugram Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package environ 6 7 import ( 8 "sort" 9 "strings" 10 "sync" 11 ) 12 13 type Environ struct { 14 mu sync.Mutex 15 m map[string]string 16 } 17 18 func New() *Environ { 19 return &Environ{m: make(map[string]string)} 20 } 21 22 func NewFrom(vals []string) *Environ { 23 env := New() 24 for _, s := range vals { 25 i := strings.Index(s, "=") 26 env.Set(s[:i], s[i+1:]) 27 } 28 return env 29 } 30 31 func (e *Environ) GetVal(key interface{}) interface{} { return e.Get(key.(string)) } 32 func (e *Environ) SetVal(key, val interface{}) { e.Set(key.(string), val.(string)) } 33 34 func (e *Environ) Get(key string) string { 35 e.mu.Lock() 36 v := e.m[key] 37 e.mu.Unlock() 38 return v 39 } 40 41 func (e *Environ) Set(key, value string) { 42 e.mu.Lock() 43 e.m[key] = value 44 e.mu.Unlock() 45 } 46 47 func (e *Environ) List() []string { 48 e.mu.Lock() 49 l := make([]string, 0, len(e.m)) 50 for k, v := range e.m { 51 l = append(l, k+"="+v) 52 } 53 e.mu.Unlock() 54 sort.Strings(l) 55 return l 56 } 57 58 func (e *Environ) Keys(prefix string) []string { 59 var res []string 60 e.mu.Lock() 61 for k := range e.m { 62 if strings.HasPrefix(k, prefix) { 63 res = append(res, k) 64 } 65 } 66 e.mu.Unlock() 67 sort.Strings(res) 68 return res 69 }