...
1 package objx
2
3 import (
4 "encoding/base64"
5 "encoding/json"
6 "errors"
7 "io/ioutil"
8 "net/url"
9 "strings"
10 )
11
12
13
14 type MSIConvertable interface {
15
16
17 MSI() map[string]interface{}
18 }
19
20
21
22 type Map map[string]interface{}
23
24
25 func (m Map) Value() *Value {
26 return &Value{data: m}
27 }
28
29
30 var Nil = New(nil)
31
32
33
34
35 func New(data interface{}) Map {
36 if _, ok := data.(map[string]interface{}); !ok {
37 if converter, ok := data.(MSIConvertable); ok {
38 data = converter.MSI()
39 } else {
40 return nil
41 }
42 }
43 return Map(data.(map[string]interface{}))
44 }
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60 func MSI(keyAndValuePairs ...interface{}) Map {
61 newMap := Map{}
62 keyAndValuePairsLen := len(keyAndValuePairs)
63 if keyAndValuePairsLen%2 != 0 {
64 return nil
65 }
66 for i := 0; i < keyAndValuePairsLen; i = i + 2 {
67 key := keyAndValuePairs[i]
68 value := keyAndValuePairs[i+1]
69
70
71 keyString, keyStringOK := key.(string)
72 if !keyStringOK {
73 return nil
74 }
75 newMap[keyString] = value
76 }
77 return newMap
78 }
79
80
81
82
83
84
85
86 func MustFromJSON(jsonString string) Map {
87 o, err := FromJSON(jsonString)
88 if err != nil {
89 panic("objx: MustFromJSON failed with error: " + err.Error())
90 }
91 return o
92 }
93
94
95
96
97
98 func MustFromJSONSlice(jsonString string) []Map {
99 slice, err := FromJSONSlice(jsonString)
100 if err != nil {
101 panic("objx: MustFromJSONSlice failed with error: " + err.Error())
102 }
103 return slice
104 }
105
106
107
108
109
110 func FromJSON(jsonString string) (Map, error) {
111 var m Map
112 err := json.Unmarshal([]byte(jsonString), &m)
113 if err != nil {
114 return Nil, err
115 }
116 return m, nil
117 }
118
119
120
121
122
123 func FromJSONSlice(jsonString string) ([]Map, error) {
124 var slice []Map
125 err := json.Unmarshal([]byte(jsonString), &slice)
126 if err != nil {
127 return nil, err
128 }
129 return slice, nil
130 }
131
132
133
134
135
136 func FromBase64(base64String string) (Map, error) {
137 decoder := base64.NewDecoder(base64.StdEncoding, strings.NewReader(base64String))
138 decoded, err := ioutil.ReadAll(decoder)
139 if err != nil {
140 return nil, err
141 }
142 return FromJSON(string(decoded))
143 }
144
145
146
147
148
149 func MustFromBase64(base64String string) Map {
150 result, err := FromBase64(base64String)
151 if err != nil {
152 panic("objx: MustFromBase64 failed with error: " + err.Error())
153 }
154 return result
155 }
156
157
158
159
160
161 func FromSignedBase64(base64String, key string) (Map, error) {
162 parts := strings.Split(base64String, SignatureSeparator)
163 if len(parts) != 2 {
164 return nil, errors.New("objx: Signed base64 string is malformed")
165 }
166
167 sig := HashWithKey(parts[0], key)
168 if parts[1] != sig {
169 return nil, errors.New("objx: Signature for base64 data does not match")
170 }
171 return FromBase64(parts[0])
172 }
173
174
175
176
177
178 func MustFromSignedBase64(base64String, key string) Map {
179 result, err := FromSignedBase64(base64String, key)
180 if err != nil {
181 panic("objx: MustFromSignedBase64 failed with error: " + err.Error())
182 }
183 return result
184 }
185
186
187
188
189
190 func FromURLQuery(query string) (Map, error) {
191 vals, err := url.ParseQuery(query)
192 if err != nil {
193 return nil, err
194 }
195 m := Map{}
196 for k, vals := range vals {
197 m[k] = vals[0]
198 }
199 return m, nil
200 }
201
202
203
204
205
206
207
208 func MustFromURLQuery(query string) Map {
209 o, err := FromURLQuery(query)
210 if err != nil {
211 panic("objx: MustFromURLQuery failed with error: " + err.Error())
212 }
213 return o
214 }
215
View as plain text