-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathresolve.go
121 lines (115 loc) · 3.78 KB
/
resolve.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
package simplejsonx
import (
"github.com/bitly/go-simplejson"
"github.com/pkg/errors"
"github.com/yyle88/tern"
)
// Extract retrieves the value associated with the given key in the JSON object.
func Extract[T any](simpleJson *simplejson.Json, key string) (T, error) {
if simpleJson == nil {
return tern.Zero[T](), errors.New("parameter simpleJson is missing")
}
return Resolve[T](simpleJson.Get(key))
}
// Inspect retrieves the value of the given key if it exists in the JSON object, returning the zero value if the key is missing.
func Inspect[T any](simpleJson *simplejson.Json, key string) (T, error) {
if simpleJson == nil {
return tern.Zero[T](), errors.New("parameter simpleJson is missing")
}
value, exist := simpleJson.CheckGet(key)
if !exist {
return tern.Zero[T](), nil
}
return Resolve[T](value)
}
/*
Resolve extracts the value from the provided JSON and convert it to typed value.
Supports the following functions:
func (j *Json) Int() (int, error)
func (j *Json) Int64() (int64, error)
func (j *Json) Float64() (float64, error)
func (j *Json) String() (string, error)
func (j *Json) Uint64() (uint64, error)
func (j *Json) Bool() (bool, error)
func (j *Json) StringArray() ([]string, error)
func (j *Json) Array() ([]interface{}, error)
func (j *Json) Map() (map[string]interface{}, error)
func (j *Json) Bytes() ([]byte, error)
*/
func Resolve[T any](simpleJson *simplejson.Json) (T, error) {
if simpleJson == nil {
return tern.Zero[T](), errors.New("parameter simpleJson is missing")
}
switch zero := tern.Zero[T](); any(zero).(type) {
case int:
res, err := simpleJson.Int()
if err != nil {
return zero, errors.WithMessage(err, "unable to resolve JSON value to int")
}
return any(res).(T), nil
case int64:
res, err := simpleJson.Int64()
if err != nil {
return zero, errors.WithMessage(err, "unable to resolve JSON value to int64")
}
return any(res).(T), nil
case float64:
res, err := simpleJson.Float64()
if err != nil {
return zero, errors.WithMessage(err, "unable to resolve JSON value to float64")
}
return any(res).(T), nil
case string:
res, err := simpleJson.String()
if err != nil {
return zero, errors.WithMessage(err, "unable to resolve JSON value to string")
}
return any(res).(T), nil
case uint64:
res, err := simpleJson.Uint64()
if err != nil {
return zero, errors.WithMessage(err, "unable to resolve JSON value to uint64")
}
return any(res).(T), nil
case bool:
res, err := simpleJson.Bool()
if err != nil {
return zero, errors.WithMessage(err, "unable to resolve JSON value to bool")
}
return any(res).(T), nil
case []string:
res, err := simpleJson.StringArray()
if err != nil {
return zero, errors.WithMessage(err, "unable to resolve JSON value to []string")
}
return any(res).(T), nil
case []interface{}:
res, err := simpleJson.Array()
if err != nil {
return zero, errors.WithMessage(err, "unable to resolve JSON value to []interface{}")
}
return any(res).(T), nil
case map[string]interface{}:
res, err := simpleJson.Map()
if err != nil {
return zero, errors.WithMessage(err, "unable to resolve JSON value to map[string]interface{}")
}
return any(res).(T), nil
case []byte:
res, err := simpleJson.Bytes()
if err != nil {
return zero, errors.WithMessage(err, "unable to resolve JSON value to []byte")
}
return any(res).(T), nil
default:
return zero, errors.Errorf("unsupported generic type: %T. unable to resolve JSON value.", zero)
}
}
// GetList retrieves a slice of simplejson.Json objects from the key's list (a[key]).
func GetList(simpleJson *simplejson.Json, key string) (simpleJsons []*simplejson.Json, err error) {
elements, err := simpleJson.Get(key).Array()
if err != nil {
return simpleJsons, errors.WithMessage(err, "unable to get list")
}
return List(elements), nil
}