1 package mapx
2
3 import (
4 "encoding/json"
5 "errors"
6 "fmt"
7 "time"
8 )
9
10
11 var ErrKeyDoesNotExist = errors.New("key is not present in map")
12
13
14 var ErrKeyCanNotBeTypeAsserted = errors.New("key could not be type asserted")
15
16
17 func GetString(values map[interface{}]interface{}, key interface{}) (string, error) {
18 if v, ok := values[key]; !ok {
19 return "", ErrKeyDoesNotExist
20 } else if sv, ok := v.(string); !ok {
21 return "", ErrKeyCanNotBeTypeAsserted
22 } else {
23 return sv, nil
24 }
25 }
26
27
28 func GetStringSlice(values map[interface{}]interface{}, key interface{}) ([]string, error) {
29 if v, ok := values[key]; !ok {
30 return []string{}, ErrKeyDoesNotExist
31 } else if sv, ok := v.([]string); ok {
32 return sv, nil
33 } else if sv, ok := v.([]interface{}); ok {
34 vs := make([]string, len(sv))
35 for k, v := range sv {
36 vv, ok := v.(string)
37 if !ok {
38 return []string{}, ErrKeyCanNotBeTypeAsserted
39 }
40 vs[k] = vv
41 }
42 return vs, nil
43 }
44 return []string{}, ErrKeyCanNotBeTypeAsserted
45 }
46
47
48 func GetTime(values map[interface{}]interface{}, key interface{}) (time.Time, error) {
49 v, ok := values[key]
50 if !ok {
51 return time.Time{}, ErrKeyDoesNotExist
52 }
53
54 if sv, ok := v.(time.Time); ok {
55 return sv, nil
56 } else if sv, ok := v.(int64); ok {
57 return time.Unix(sv, 0), nil
58 } else if sv, ok := v.(int32); ok {
59 return time.Unix(int64(sv), 0), nil
60 } else if sv, ok := v.(int); ok {
61 return time.Unix(int64(sv), 0), nil
62 } else if sv, ok := v.(float64); ok {
63 return time.Unix(int64(sv), 0), nil
64 } else if sv, ok := v.(float32); ok {
65 return time.Unix(int64(sv), 0), nil
66 }
67
68 return time.Time{}, ErrKeyCanNotBeTypeAsserted
69 }
70
71
72 func GetInt64Default(values map[interface{}]interface{}, key interface{}, defaultValue int64) int64 {
73 f, err := GetInt64(values, key)
74 if err != nil {
75 return defaultValue
76 }
77 return f
78 }
79
80
81 func GetInt64(values map[interface{}]interface{}, key interface{}) (int64, error) {
82 if v, ok := values[key]; !ok {
83 return 0, ErrKeyDoesNotExist
84 } else if j, ok := v.(json.Number); ok {
85 return j.Int64()
86 } else if sv, ok := v.(int64); ok {
87 return sv, nil
88 }
89 return 0, ErrKeyCanNotBeTypeAsserted
90 }
91
92
93 func GetInt32Default(values map[interface{}]interface{}, key interface{}, defaultValue int32) int32 {
94 f, err := GetInt32(values, key)
95 if err != nil {
96 return defaultValue
97 }
98 return f
99 }
100
101
102 func GetInt32(values map[interface{}]interface{}, key interface{}) (int32, error) {
103 if v, ok := values[key]; !ok {
104 return 0, ErrKeyDoesNotExist
105 } else if sv, ok := v.(int32); ok {
106 return sv, nil
107 } else if sv, ok := v.(int); ok {
108 return int32(sv), nil
109 } else if j, ok := v.(json.Number); ok {
110 v, err := j.Int64()
111 return int32(v), err
112 }
113 return 0, ErrKeyCanNotBeTypeAsserted
114 }
115
116
117 func GetIntDefault(values map[interface{}]interface{}, key interface{}, defaultValue int) int {
118 f, err := GetInt(values, key)
119 if err != nil {
120 return defaultValue
121 }
122 return f
123 }
124
125
126 func GetInt(values map[interface{}]interface{}, key interface{}) (int, error) {
127 if v, ok := values[key]; !ok {
128 return 0, ErrKeyDoesNotExist
129 } else if sv, ok := v.(int32); ok {
130 return int(sv), nil
131 } else if sv, ok := v.(int); ok {
132 return sv, nil
133 } else if j, ok := v.(json.Number); ok {
134 v, err := j.Int64()
135 return int(v), err
136 }
137 return 0, ErrKeyCanNotBeTypeAsserted
138
139 }
140
141
142 func GetFloat32Default(values map[interface{}]interface{}, key interface{}, defaultValue float32) float32 {
143 f, err := GetFloat32(values, key)
144 if err != nil {
145 return defaultValue
146 }
147 return f
148 }
149
150
151 func GetFloat32(values map[interface{}]interface{}, key interface{}) (float32, error) {
152 if v, ok := values[key]; !ok {
153 return 0, ErrKeyDoesNotExist
154 } else if j, ok := v.(json.Number); ok {
155 v, err := j.Float64()
156 return float32(v), err
157 } else if sv, ok := v.(float32); ok {
158 return sv, nil
159 }
160 return 0, ErrKeyCanNotBeTypeAsserted
161 }
162
163
164 func GetFloat64Default(values map[interface{}]interface{}, key interface{}, defaultValue float64) float64 {
165 f, err := GetFloat64(values, key)
166 if err != nil {
167 return defaultValue
168 }
169 return f
170 }
171
172
173 func GetFloat64(values map[interface{}]interface{}, key interface{}) (float64, error) {
174 if v, ok := values[key]; !ok {
175 return 0, ErrKeyDoesNotExist
176 } else if j, ok := v.(json.Number); ok {
177 return j.Float64()
178 } else if sv, ok := v.(float64); ok {
179 return sv, nil
180 }
181 return 0, ErrKeyCanNotBeTypeAsserted
182 }
183
184
185 func GetStringDefault(values map[interface{}]interface{}, key interface{}, defaultValue string) string {
186 if s, err := GetString(values, key); err == nil {
187 return s
188 }
189 return defaultValue
190 }
191
192
193 func GetStringSliceDefault(values map[interface{}]interface{}, key interface{}, defaultValue []string) []string {
194 if s, err := GetStringSlice(values, key); err == nil {
195 return s
196 }
197 return defaultValue
198 }
199
200
201 func KeyStringToInterface(i map[string]interface{}) map[interface{}]interface{} {
202 o := make(map[interface{}]interface{})
203 for k, v := range i {
204 o[k] = v
205 }
206 return o
207 }
208
209
210 func ToJSONMap(i interface{}) interface{} {
211 switch t := i.(type) {
212 case []interface{}:
213 for k, v := range t {
214 t[k] = ToJSONMap(v)
215 }
216 return t
217 case map[string]interface{}:
218 for k, v := range t {
219 t[k] = ToJSONMap(v)
220 }
221 return t
222 case map[interface{}]interface{}:
223 res := make(map[string]interface{})
224 for k, v := range t {
225 res[fmt.Sprintf("%s", k)] = ToJSONMap(v)
226 }
227 return res
228 }
229
230 return i
231 }
232
View as plain text