@@ -39,14 +39,8 @@ import (
39
39
const (
40
40
emptyPointer = ``
41
41
pointerSeparator = `/`
42
-
43
- invalidStart = `JSON pointer must be empty or start with a "` + pointerSeparator
44
- notFound = `Can't find the pointer in the document`
45
42
)
46
43
47
- var jsonPointableType = reflect .TypeOf (new (JSONPointable )).Elem ()
48
- var jsonSetableType = reflect .TypeOf (new (JSONSetable )).Elem ()
49
-
50
44
// JSONPointable is an interface for structs to implement when they need to customize the
51
45
// json pointer process
52
46
type JSONPointable interface {
@@ -80,7 +74,7 @@ func (p *Pointer) parse(jsonPointerString string) error {
80
74
81
75
if jsonPointerString != emptyPointer {
82
76
if ! strings .HasPrefix (jsonPointerString , pointerSeparator ) {
83
- err = errors .New ( invalidStart )
77
+ err = errors .Join ( ErrInvalidStart , ErrPointer )
84
78
} else {
85
79
referenceTokens := strings .Split (jsonPointerString , pointerSeparator )
86
80
p .referenceTokens = append (p .referenceTokens , referenceTokens [1 :]... )
@@ -128,7 +122,7 @@ func getSingleImpl(node any, decodedToken string, nameProvider *swag.NameProvide
128
122
rValue := reflect .Indirect (reflect .ValueOf (node ))
129
123
kind := rValue .Kind ()
130
124
if isNil (node ) {
131
- return nil , kind , fmt .Errorf ("nil value has not field %q" , decodedToken )
125
+ return nil , kind , fmt .Errorf ("nil value has no field %q: %w " , decodedToken , ErrPointer )
132
126
}
133
127
134
128
switch typed := node .(type ) {
@@ -146,7 +140,7 @@ func getSingleImpl(node any, decodedToken string, nameProvider *swag.NameProvide
146
140
case reflect .Struct :
147
141
nm , ok := nameProvider .GetGoNameForType (rValue .Type (), decodedToken )
148
142
if ! ok {
149
- return nil , kind , fmt .Errorf ("object has no field %q" , decodedToken )
143
+ return nil , kind , fmt .Errorf ("object has no field %q: %w " , decodedToken , ErrPointer )
150
144
}
151
145
fld := rValue .FieldByName (nm )
152
146
return fld .Interface (), kind , nil
@@ -158,7 +152,7 @@ func getSingleImpl(node any, decodedToken string, nameProvider *swag.NameProvide
158
152
if mv .IsValid () {
159
153
return mv .Interface (), kind , nil
160
154
}
161
- return nil , kind , fmt .Errorf ("object has no key %q" , decodedToken )
155
+ return nil , kind , fmt .Errorf ("object has no key %q: %w " , decodedToken , ErrPointer )
162
156
163
157
case reflect .Slice :
164
158
tokenIndex , err := strconv .Atoi (decodedToken )
@@ -167,14 +161,14 @@ func getSingleImpl(node any, decodedToken string, nameProvider *swag.NameProvide
167
161
}
168
162
sLength := rValue .Len ()
169
163
if tokenIndex < 0 || tokenIndex >= sLength {
170
- return nil , kind , fmt .Errorf ("index out of bounds array[0,%d] index '%d'" , sLength - 1 , tokenIndex )
164
+ return nil , kind , fmt .Errorf ("index out of bounds array[0,%d] index '%d': %w " , sLength - 1 , tokenIndex , ErrPointer )
171
165
}
172
166
173
167
elem := rValue .Index (tokenIndex )
174
168
return elem .Interface (), kind , nil
175
169
176
170
default :
177
- return nil , kind , fmt .Errorf ("invalid token reference %q" , decodedToken )
171
+ return nil , kind , fmt .Errorf ("invalid token reference %q: %w " , decodedToken , ErrPointer )
178
172
}
179
173
180
174
}
@@ -194,7 +188,7 @@ func setSingleImpl(node, data any, decodedToken string, nameProvider *swag.NameP
194
188
case reflect .Struct :
195
189
nm , ok := nameProvider .GetGoNameForType (rValue .Type (), decodedToken )
196
190
if ! ok {
197
- return fmt .Errorf ("object has no field %q" , decodedToken )
191
+ return fmt .Errorf ("object has no field %q: %w " , decodedToken , ErrPointer )
198
192
}
199
193
fld := rValue .FieldByName (nm )
200
194
if fld .IsValid () {
@@ -214,18 +208,18 @@ func setSingleImpl(node, data any, decodedToken string, nameProvider *swag.NameP
214
208
}
215
209
sLength := rValue .Len ()
216
210
if tokenIndex < 0 || tokenIndex >= sLength {
217
- return fmt .Errorf ("index out of bounds array[0,%d] index '%d'" , sLength , tokenIndex )
211
+ return fmt .Errorf ("index out of bounds array[0,%d] index '%d': %w " , sLength , tokenIndex , ErrPointer )
218
212
}
219
213
220
214
elem := rValue .Index (tokenIndex )
221
215
if ! elem .CanSet () {
222
- return fmt .Errorf ("can't set slice index %s to %v" , decodedToken , data )
216
+ return fmt .Errorf ("can't set slice index %s to %v: %w " , decodedToken , data , ErrPointer )
223
217
}
224
218
elem .Set (reflect .ValueOf (data ))
225
219
return nil
226
220
227
221
default :
228
- return fmt .Errorf ("invalid token reference %q" , decodedToken )
222
+ return fmt .Errorf ("invalid token reference %q: %w " , decodedToken , ErrPointer )
229
223
}
230
224
231
225
}
@@ -244,7 +238,6 @@ func (p *Pointer) get(node any, nameProvider *swag.NameProvider) (any, reflect.K
244
238
}
245
239
246
240
for _ , token := range p .referenceTokens {
247
-
248
241
decodedToken := Unescape (token )
249
242
250
243
r , knd , err := getSingleImpl (node , decodedToken , nameProvider )
@@ -264,7 +257,10 @@ func (p *Pointer) set(node, data any, nameProvider *swag.NameProvider) error {
264
257
knd := reflect .ValueOf (node ).Kind ()
265
258
266
259
if knd != reflect .Ptr && knd != reflect .Struct && knd != reflect .Map && knd != reflect .Slice && knd != reflect .Array {
267
- return errors .New ("only structs, pointers, maps and slices are supported for setting values" )
260
+ return errors .Join (
261
+ ErrUnsupportedValueType ,
262
+ ErrPointer ,
263
+ )
268
264
}
269
265
270
266
if nameProvider == nil {
@@ -307,7 +303,7 @@ func (p *Pointer) set(node, data any, nameProvider *swag.NameProvider) error {
307
303
case reflect .Struct :
308
304
nm , ok := nameProvider .GetGoNameForType (rValue .Type (), decodedToken )
309
305
if ! ok {
310
- return fmt .Errorf ("object has no field %q" , decodedToken )
306
+ return fmt .Errorf ("object has no field %q: %w " , decodedToken , ErrPointer )
311
307
}
312
308
fld := rValue .FieldByName (nm )
313
309
if fld .CanAddr () && fld .Kind () != reflect .Interface && fld .Kind () != reflect .Map && fld .Kind () != reflect .Slice && fld .Kind () != reflect .Ptr {
@@ -321,7 +317,7 @@ func (p *Pointer) set(node, data any, nameProvider *swag.NameProvider) error {
321
317
mv := rValue .MapIndex (kv )
322
318
323
319
if ! mv .IsValid () {
324
- return fmt .Errorf ("object has no key %q" , decodedToken )
320
+ return fmt .Errorf ("object has no key %q: %w " , decodedToken , ErrPointer )
325
321
}
326
322
if mv .CanAddr () && mv .Kind () != reflect .Interface && mv .Kind () != reflect .Map && mv .Kind () != reflect .Slice && mv .Kind () != reflect .Ptr {
327
323
node = mv .Addr ().Interface ()
@@ -336,7 +332,7 @@ func (p *Pointer) set(node, data any, nameProvider *swag.NameProvider) error {
336
332
}
337
333
sLength := rValue .Len ()
338
334
if tokenIndex < 0 || tokenIndex >= sLength {
339
- return fmt .Errorf ("index out of bounds array[0,%d] index '%d'" , sLength , tokenIndex )
335
+ return fmt .Errorf ("index out of bounds array[0,%d] index '%d': %w " , sLength , tokenIndex , ErrPointer )
340
336
}
341
337
342
338
elem := rValue .Index (tokenIndex )
@@ -347,7 +343,7 @@ func (p *Pointer) set(node, data any, nameProvider *swag.NameProvider) error {
347
343
node = elem .Interface ()
348
344
349
345
default :
350
- return fmt .Errorf ("invalid token reference %q" , decodedToken )
346
+ return fmt .Errorf ("invalid token reference %q: %w " , decodedToken , ErrPointer )
351
347
}
352
348
353
349
}
@@ -404,10 +400,10 @@ func (p *Pointer) Offset(document string) (int64, error) {
404
400
return 0 , err
405
401
}
406
402
default :
407
- return 0 , fmt .Errorf ("invalid token %#v" , tk )
403
+ return 0 , fmt .Errorf ("invalid token %#v: %w " , tk , ErrPointer )
408
404
}
409
405
default :
410
- return 0 , fmt .Errorf ("invalid token %#v" , tk )
406
+ return 0 , fmt .Errorf ("invalid token %#v: %w " , tk , ErrPointer )
411
407
}
412
408
}
413
409
return offset , nil
@@ -437,16 +433,16 @@ func offsetSingleObject(dec *json.Decoder, decodedToken string) (int64, error) {
437
433
return offset , nil
438
434
}
439
435
default :
440
- return 0 , fmt .Errorf ("invalid token %#v" , tk )
436
+ return 0 , fmt .Errorf ("invalid token %#v: %w " , tk , ErrPointer )
441
437
}
442
438
}
443
- return 0 , fmt .Errorf ("token reference %q not found" , decodedToken )
439
+ return 0 , fmt .Errorf ("token reference %q not found: %w " , decodedToken , ErrPointer )
444
440
}
445
441
446
442
func offsetSingleArray (dec * json.Decoder , decodedToken string ) (int64 , error ) {
447
443
idx , err := strconv .Atoi (decodedToken )
448
444
if err != nil {
449
- return 0 , fmt .Errorf ("token reference %q is not a number: %v" , decodedToken , err )
445
+ return 0 , fmt .Errorf ("token reference %q is not a number: %v: %w " , decodedToken , err , ErrPointer )
450
446
}
451
447
var i int
452
448
for i = 0 ; i < idx && dec .More (); i ++ {
@@ -470,7 +466,7 @@ func offsetSingleArray(dec *json.Decoder, decodedToken string) (int64, error) {
470
466
}
471
467
472
468
if ! dec .More () {
473
- return 0 , fmt .Errorf ("token reference %q not found" , decodedToken )
469
+ return 0 , fmt .Errorf ("token reference %q not found: %w " , decodedToken , ErrPointer )
474
470
}
475
471
return dec .InputOffset (), nil
476
472
}
0 commit comments