/
instance_key_map.go
137 lines (117 loc) · 3.48 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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
/*
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
}
// Intersect returns a keymap which is the intersection of this and another map
func (this *InstanceKeyMap) Intersect(other *InstanceKeyMap) *InstanceKeyMap {
intersected := NewInstanceKeyMap()
for key := range *other {
if this.HasKey(key) {
intersected.AddKey(key)
}
}
return intersected
}
// MarshalJSON will marshal this map as JSON
func (this InstanceKeyMap) MarshalJSON() ([]byte, error) {
return json.Marshal(this.GetInstanceKeys())
}
// UnmarshalJSON reds this object from JSON
func (this *InstanceKeyMap) UnmarshalJSON(b []byte) error {
var keys []InstanceKey
if err := json.Unmarshal(b, &keys); err != nil {
return err
}
*this = make(InstanceKeyMap)
for _, key := range keys {
this.AddKey(key)
}
return nil
}
// 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 := ParseResolveInstanceKey(token)
if err != nil {
return err
}
this.AddKey(*key)
}
return nil
}