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  }