-
Notifications
You must be signed in to change notification settings - Fork 0
/
instance_key_map.go
113 lines (95 loc) · 2.9 KB
/
instance_key_map.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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
/*
Copyright 2015 Shlomi Noach, courtesy Booking.com
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package inst
import (
"encoding/json"
"strings"
)
// InstanceKeyMap is a convenience struct for listing InstanceKey-s
type InstanceKeyMap map[InstanceKey]bool
func NewInstanceKeyMap() *InstanceKeyMap {
return &InstanceKeyMap{}
}
// AddKey adds a single key to this map
func (this *InstanceKeyMap) AddKey(key InstanceKey) {
(*this)[key] = true
}
// AddKeys adds all given keys to this map
func (this *InstanceKeyMap) AddKeys(keys []InstanceKey) {
for _, key := range keys {
this.AddKey(key)
}
}
// AddInstances adds keys of all given instances to this map
func (this *InstanceKeyMap) AddInstances(instances [](*Instance)) {
for _, instance := range instances {
this.AddKey(instance.Key)
}
}
// HasKey checks if given key is within the map
func (this *InstanceKeyMap) HasKey(key InstanceKey) bool {
_, ok := (*this)[key]
return ok
}
// GetInstanceKeys returns keys in this map in the form of an array
func (this *InstanceKeyMap) GetInstanceKeys() []InstanceKey {
res := []InstanceKey{}
for key := range *this {
res = append(res, key)
}
return res
}
// MarshalJSON will marshal this map as JSON
func (this *InstanceKeyMap) MarshalJSON() ([]byte, error) {
return json.Marshal(this.GetInstanceKeys())
}
// ToJSON will marshal this map as JSON
func (this *InstanceKeyMap) ToJSON() (string, error) {
bytes, err := this.MarshalJSON()
return string(bytes), err
}
// ToJSONString will marshal this map as JSON
func (this *InstanceKeyMap) ToJSONString() string {
s, _ := this.ToJSON()
return s
}
// ToCommaDelimitedList will export this map in comma delimited format
func (this *InstanceKeyMap) ToCommaDelimitedList() string {
keyDisplays := []string{}
for key := range *this {
keyDisplays = append(keyDisplays, key.DisplayString())
}
return strings.Join(keyDisplays, ",")
}
// ReadJson unmarshalls a json into this map
func (this *InstanceKeyMap) ReadJson(jsonString string) error {
var keys []InstanceKey
err := json.Unmarshal([]byte(jsonString), &keys)
if err != nil {
return err
}
this.AddKeys(keys)
return err
}
// ReadJson unmarshalls a json into this map
func (this *InstanceKeyMap) ReadCommaDelimitedList(list string) error {
tokens := strings.Split(list, ",")
for _, token := range tokens {
key, err := ParseInstanceKey(token)
if err != nil {
return err
}
this.AddKey(*key)
}
return nil
}