-
Notifications
You must be signed in to change notification settings - Fork 4
/
namespace.go
84 lines (69 loc) · 2.13 KB
/
namespace.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
package argparse
import "fmt"
// Namespace is a map of key-value pairs, used for storing pairings
// between options' destinations and their associated values. It will
// contain only `string` and `[]string` values.
type Namespace map[string]interface{}
// Get will retrieve either a string or a []string if the specified key
// exists in the mapping. Otherwise, an empty string is returned
func (n Namespace) Get(key string) interface{} {
if !n.KeyExists(key) {
return nil
}
return n[key]
}
// KeyExists returns a bool indicating true if the key does exist in the mapping,
// or otherwise false.
func (n Namespace) KeyExists(key string) bool {
if _, ok := n[key]; ok {
return true
}
return false
}
// Require will assert that all the specified keys exist in the namespace.
func (n Namespace) Require(keys ...string) error {
for _, key := range keys {
if !n.KeyExists(key) {
return fmt.Errorf("Missing option: %s", key)
}
}
return nil
}
// Set will set the mapping's value at the desired key to the value provided.
func (n *Namespace) Set(key string, value interface{}) *Namespace {
if n == nil {
n = new(Namespace)
}
(*n)[key] = value
return n
}
// Slice will retrieve either a string or a []string if the specified key
// exists in the mapping. Otherwise, an empty string is returned
func (n Namespace) Slice(key string) []string {
if !n.KeyExists(key) {
return nil
}
slice, _ := n[key].([]string)
return slice
}
// String will retrieve either a string or a []string if the specified key
// exists in the mapping. Otherwise, an empty string is returned
func (n Namespace) String(key string) string {
if !n.KeyExists(key) {
return ""
}
return n[key].(string)
}
// Try will retrieve either a string or a []string if the specified key
// exists in the mapping. Otherwise, an error is returned.
func (n Namespace) Try(key string) (interface{}, error) {
if !n.KeyExists(key) {
return nil, fmt.Errorf("Key \"%s\" does not exist in namespace", key)
}
return n[key], nil
}
// NewNamespace will return a pointer to a new Namespace instance.
func NewNamespace() *Namespace {
n := Namespace(make(map[string]interface{}))
return &n
}