@@ -9,6 +9,17 @@ import (
9
9
"unsafe"
10
10
)
11
11
12
+ // Errors
13
+ var (
14
+ KeyPathNotFoundError = errors .New ("Key path not found" )
15
+ UnknownValueTypeError = errors .New ("Unknown value type" )
16
+ MalformedJsonError = errors .New ("Malformed JSON error" )
17
+ MalformedStringError = errors .New ("Value is string, but can't find closing '\" ' symbol" )
18
+ MalformedArrayError = errors .New ("Value is array, but can't find closing ']' symbol" )
19
+ MalformedObjectError = errors .New ("Value looks like object, but can't find closing '}' symbol" )
20
+ MalformedValueError = errors .New ("Value looks like Number/Boolean/None, but can't find its end: ',' or '}' symbol" )
21
+ )
22
+
12
23
func tokenEnd (data []byte ) int {
13
24
for i , c := range data {
14
25
switch c {
@@ -186,15 +197,15 @@ If no keys provided it will try to extract closest JSON value (simple ones or ob
186
197
func Get (data []byte , keys ... string ) (value []byte , dataType ValueType , offset int , err error ) {
187
198
if len (keys ) > 0 {
188
199
if offset = searchKeys (data , keys ... ); offset == - 1 {
189
- return []byte {}, NotExist , - 1 , errors . New ( "Key path not found" )
200
+ return []byte {}, NotExist , - 1 , KeyPathNotFoundError
190
201
}
191
202
}
192
203
193
204
// Go to closest value
194
205
nO := nextToken (data [offset :], false )
195
206
196
207
if nO == - 1 {
197
- return []byte {}, NotExist , - 1 , errors . New ( "Malformed JSON error" )
208
+ return []byte {}, NotExist , - 1 , MalformedJsonError
198
209
}
199
210
200
211
offset += nO
@@ -206,15 +217,15 @@ func Get(data []byte, keys ...string) (value []byte, dataType ValueType, offset
206
217
if idx := stringEnd (data [offset + 1 :]); idx != - 1 {
207
218
endOffset += idx + 1
208
219
} else {
209
- return []byte {}, dataType , offset , errors . New ( "Value is string, but can't find closing ' \" ' symbol" )
220
+ return []byte {}, dataType , offset , MalformedStringError
210
221
}
211
222
} else if data [offset ] == '[' { // if array value
212
223
dataType = Array
213
224
// break label, for stopping nested loops
214
225
endOffset = blockEnd (data [offset :], '[' , ']' )
215
226
216
227
if endOffset == - 1 {
217
- return []byte {}, dataType , offset , errors . New ( "Value is array, but can't find closing ']' symbol" )
228
+ return []byte {}, dataType , offset , MalformedArrayError
218
229
}
219
230
220
231
endOffset += offset
@@ -224,7 +235,7 @@ func Get(data []byte, keys ...string) (value []byte, dataType ValueType, offset
224
235
endOffset = blockEnd (data [offset :], '{' , '}' )
225
236
226
237
if endOffset == - 1 {
227
- return []byte {}, dataType , offset , errors . New ( "Value looks like object, but can't find closing '}' symbol" )
238
+ return []byte {}, dataType , offset , MalformedObjectError
228
239
}
229
240
230
241
endOffset += offset
@@ -233,7 +244,7 @@ func Get(data []byte, keys ...string) (value []byte, dataType ValueType, offset
233
244
end := tokenEnd (data [endOffset :])
234
245
235
246
if end == - 1 {
236
- return nil , dataType , offset , errors . New ( "Value looks like Number/Boolean/None, but can't find its end: ',' or '}' symbol" )
247
+ return nil , dataType , offset , MalformedValueError
237
248
}
238
249
239
250
value := data [offset : endOffset + end ]
@@ -243,18 +254,18 @@ func Get(data []byte, keys ...string) (value []byte, dataType ValueType, offset
243
254
if bytes .Equal (value , trueLiteral ) || bytes .Equal (value , falseLiteral ) {
244
255
dataType = Boolean
245
256
} else {
246
- return nil , Unknown , offset , errors . New ( "Unknown value type" )
257
+ return nil , Unknown , offset , UnknownValueTypeError
247
258
}
248
259
case 'u' , 'n' : // undefined or null
249
260
if bytes .Equal (value , nullLiteral ) {
250
261
dataType = Null
251
262
} else {
252
- return nil , Unknown , offset , errors . New ( "Unknown value type" )
263
+ return nil , Unknown , offset , UnknownValueTypeError
253
264
}
254
265
case '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' , '-' :
255
266
dataType = Number
256
267
default :
257
- return nil , Unknown , offset , errors . New ( "Unknown value type" )
268
+ return nil , Unknown , offset , UnknownValueTypeError
258
269
}
259
270
260
271
endOffset += end
@@ -277,27 +288,27 @@ func Get(data []byte, keys ...string) (value []byte, dataType ValueType, offset
277
288
// ArrayEach is used when iterating arrays, accepts a callback function with the same return arguments as `Get`.
278
289
func ArrayEach (data []byte , cb func (value []byte , dataType ValueType , offset int , err error ), keys ... string ) (err error ) {
279
290
if len (data ) == 0 {
280
- return errors . New ( "Object is empty" )
291
+ return MalformedObjectError
281
292
}
282
293
283
294
offset := 1
284
295
285
296
if len (keys ) > 0 {
286
297
if offset = searchKeys (data , keys ... ); offset == - 1 {
287
- return errors . New ( "Key path not found" )
298
+ return KeyPathNotFoundError
288
299
}
289
300
290
301
// Go to closest value
291
302
nO := nextToken (data [offset :], false )
292
303
293
304
if nO == - 1 {
294
- return errors . New ( "Malformed JSON" )
305
+ return MalformedJsonError
295
306
}
296
307
297
308
offset += nO
298
309
299
310
if data [offset ] != '[' {
300
- return errors . New ( "Value is not array" )
311
+ return MalformedArrayError
301
312
}
302
313
303
314
offset ++
0 commit comments