@@ -6,7 +6,6 @@ package mapx
6
6
import (
7
7
"encoding/json"
8
8
"errors"
9
- "fmt"
10
9
"math"
11
10
"time"
12
11
)
@@ -30,22 +29,25 @@ func GetString[K comparable](values map[K]any, key K) (string, error) {
30
29
31
30
// GetStringSlice returns a string slice for a given key in values.
32
31
func GetStringSlice [K comparable ](values map [K ]any , key K ) ([]string , error ) {
33
- if v , ok := values [key ]; ! ok {
34
- return []string {}, ErrKeyDoesNotExist
35
- } else if sv , ok := v .([]string ); ok {
36
- return sv , nil
37
- } else if sv , ok := v .([]any ); ok {
38
- vs := make ([]string , len (sv ))
39
- for k , v := range sv {
40
- vv , ok := v .(string )
32
+ v , ok := values [key ]
33
+ if ! ok {
34
+ return nil , ErrKeyDoesNotExist
35
+ }
36
+ switch v := v .(type ) {
37
+ case []string :
38
+ return v , nil
39
+ case []any :
40
+ vs := make ([]string , len (v ))
41
+ for k , v := range v {
42
+ var ok bool
43
+ vs [k ], ok = v .(string )
41
44
if ! ok {
42
- return [] string {} , ErrKeyCanNotBeTypeAsserted
45
+ return nil , ErrKeyCanNotBeTypeAsserted
43
46
}
44
- vs [k ] = vv
45
47
}
46
48
return vs , nil
47
49
}
48
- return [] string {} , ErrKeyCanNotBeTypeAsserted
50
+ return nil , ErrKeyCanNotBeTypeAsserted
49
51
}
50
52
51
53
// GetTime returns a string slice for a given key in values.
@@ -55,18 +57,25 @@ func GetTime[K comparable](values map[K]any, key K) (time.Time, error) {
55
57
return time.Time {}, ErrKeyDoesNotExist
56
58
}
57
59
58
- if sv , ok := v .(time.Time ); ok {
59
- return sv , nil
60
- } else if sv , ok := v .(int64 ); ok {
61
- return time .Unix (sv , 0 ), nil
62
- } else if sv , ok := v .(int32 ); ok {
63
- return time .Unix (int64 (sv ), 0 ), nil
64
- } else if sv , ok := v .(int ); ok {
65
- return time .Unix (int64 (sv ), 0 ), nil
66
- } else if sv , ok := v .(float64 ); ok {
67
- return time .Unix (int64 (sv ), 0 ), nil
68
- } else if sv , ok := v .(float32 ); ok {
69
- return time .Unix (int64 (sv ), 0 ), nil
60
+ switch v := v .(type ) {
61
+ case time.Time :
62
+ return v , nil
63
+ case int64 :
64
+ return time .Unix (v , 0 ), nil
65
+ case int32 :
66
+ return time .Unix (int64 (v ), 0 ), nil
67
+ case int :
68
+ return time .Unix (int64 (v ), 0 ), nil
69
+ case float64 :
70
+ if v < math .MinInt64 || v > math .MaxInt64 {
71
+ return time.Time {}, errors .New ("value is out of range" )
72
+ }
73
+ return time .Unix (int64 (v ), 0 ), nil
74
+ case float32 :
75
+ if v < math .MinInt64 || v > math .MaxInt64 {
76
+ return time.Time {}, errors .New ("value is out of range" )
77
+ }
78
+ return time .Unix (int64 (v ), 0 ), nil
70
79
}
71
80
72
81
return time.Time {}, ErrKeyCanNotBeTypeAsserted
@@ -166,13 +175,18 @@ func GetFloat32Default[K comparable](values map[K]any, key K, defaultValue float
166
175
167
176
// GetFloat32 returns a float32 for a given key in values.
168
177
func GetFloat32 [K comparable ](values map [K ]any , key K ) (float32 , error ) {
169
- if v , ok := values [key ]; ! ok {
178
+ v , ok := values [key ]
179
+ if ! ok {
170
180
return 0 , ErrKeyDoesNotExist
171
- } else if j , ok := v .(json.Number ); ok {
172
- v , err := j .Float64 ()
173
- return float32 (v ), err
174
- } else if sv , ok := v .(float32 ); ok {
175
- return sv , nil
181
+ }
182
+ switch v := v .(type ) {
183
+ case json.Number :
184
+ f , err := v .Float64 ()
185
+ return float32 (f ), err
186
+ case float32 :
187
+ return v , nil
188
+ case float64 :
189
+ return float32 (v ), nil
176
190
}
177
191
return 0 , ErrKeyCanNotBeTypeAsserted
178
192
}
@@ -188,12 +202,17 @@ func GetFloat64Default[K comparable](values map[K]any, key K, defaultValue float
188
202
189
203
// GetFloat64 returns a float64 for a given key in values.
190
204
func GetFloat64 [K comparable ](values map [K ]any , key K ) (float64 , error ) {
191
- if v , ok := values [key ]; ! ok {
205
+ v , ok := values [key ]
206
+ if ! ok {
192
207
return 0 , ErrKeyDoesNotExist
193
- } else if j , ok := v .(json.Number ); ok {
194
- return j .Float64 ()
195
- } else if sv , ok := v .(float64 ); ok {
196
- return sv , nil
208
+ }
209
+ switch v := v .(type ) {
210
+ case json.Number :
211
+ return v .Float64 ()
212
+ case float32 :
213
+ return float64 (v ), nil
214
+ case float64 :
215
+ return v , nil
197
216
}
198
217
return 0 , ErrKeyCanNotBeTypeAsserted
199
218
}
@@ -213,38 +232,3 @@ func GetStringSliceDefault[K comparable](values map[K]any, key K, defaultValue [
213
232
}
214
233
return defaultValue
215
234
}
216
-
217
- // KeyStringToInterface converts map[string]any to map[any]any
218
- // Deprecated: with generics, this should not be necessary anymore.
219
- func KeyStringToInterface (i map [string ]any ) map [any ]any {
220
- o := make (map [any ]any )
221
- for k , v := range i {
222
- o [k ] = v
223
- }
224
- return o
225
- }
226
-
227
- // ToJSONMap converts all map[any]any occurrences (nested as well) to map[string]any.
228
- // Deprecated: with generics, this should not be necessary anymore.
229
- func ToJSONMap (i any ) any {
230
- switch t := i .(type ) {
231
- case []any :
232
- for k , v := range t {
233
- t [k ] = ToJSONMap (v )
234
- }
235
- return t
236
- case map [string ]any :
237
- for k , v := range t {
238
- t [k ] = ToJSONMap (v )
239
- }
240
- return t
241
- case map [any ]any :
242
- res := make (map [string ]any )
243
- for k , v := range t {
244
- res [fmt .Sprintf ("%s" , k )] = ToJSONMap (v )
245
- }
246
- return res
247
- }
248
-
249
- return i
250
- }
0 commit comments