...
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 package gojsonschema
27
28 import (
29 "encoding/json"
30 "math/big"
31 "reflect"
32 )
33
34 func isKind(what interface{}, kinds ...reflect.Kind) bool {
35 target := what
36 if isJSONNumber(what) {
37
38 target = *mustBeNumber(what)
39 }
40 targetKind := reflect.ValueOf(target).Kind()
41 for _, kind := range kinds {
42 if targetKind == kind {
43 return true
44 }
45 }
46 return false
47 }
48
49 func existsMapKey(m map[string]interface{}, k string) bool {
50 _, ok := m[k]
51 return ok
52 }
53
54 func isStringInSlice(s []string, what string) bool {
55 for i := range s {
56 if s[i] == what {
57 return true
58 }
59 }
60 return false
61 }
62
63
64 func indexStringInSlice(s []string, what string) int {
65 for i := range s {
66 if s[i] == what {
67 return i
68 }
69 }
70 return -1
71 }
72
73 func marshalToJSONString(value interface{}) (*string, error) {
74
75 mBytes, err := json.Marshal(value)
76 if err != nil {
77 return nil, err
78 }
79
80 sBytes := string(mBytes)
81 return &sBytes, nil
82 }
83
84 func marshalWithoutNumber(value interface{}) (*string, error) {
85
86
87
88
89
90
91 jsonString, err := marshalToJSONString(value)
92 if err != nil {
93 return nil, err
94 }
95
96 var document interface{}
97
98 err = json.Unmarshal([]byte(*jsonString), &document)
99 if err != nil {
100 return nil, err
101 }
102
103 return marshalToJSONString(document)
104 }
105
106 func isJSONNumber(what interface{}) bool {
107
108 switch what.(type) {
109
110 case json.Number:
111 return true
112 }
113
114 return false
115 }
116
117 func checkJSONInteger(what interface{}) (isInt bool) {
118
119 jsonNumber := what.(json.Number)
120
121 bigFloat, isValidNumber := new(big.Rat).SetString(string(jsonNumber))
122
123 return isValidNumber && bigFloat.IsInt()
124
125 }
126
127
128 const (
129 maxJSONFloat = float64(1<<53 - 1)
130 minJSONFloat = -float64(1<<53 - 1)
131 )
132
133 func mustBeInteger(what interface{}) *int {
134
135 if isJSONNumber(what) {
136
137 number := what.(json.Number)
138
139 isInt := checkJSONInteger(number)
140
141 if isInt {
142
143 int64Value, err := number.Int64()
144 if err != nil {
145 return nil
146 }
147
148 int32Value := int(int64Value)
149 return &int32Value
150 }
151
152 }
153
154 return nil
155 }
156
157 func mustBeNumber(what interface{}) *big.Rat {
158
159 if isJSONNumber(what) {
160 number := what.(json.Number)
161 float64Value, success := new(big.Rat).SetString(string(number))
162 if success {
163 return float64Value
164 }
165 }
166
167 return nil
168
169 }
170
171 func convertDocumentNode(val interface{}) interface{} {
172
173 if lval, ok := val.([]interface{}); ok {
174
175 res := []interface{}{}
176 for _, v := range lval {
177 res = append(res, convertDocumentNode(v))
178 }
179
180 return res
181
182 }
183
184 if mval, ok := val.(map[interface{}]interface{}); ok {
185
186 res := map[string]interface{}{}
187
188 for k, v := range mval {
189 res[k.(string)] = convertDocumentNode(v)
190 }
191
192 return res
193
194 }
195
196 return val
197 }
198
View as plain text