@@ -39,14 +39,8 @@ import (
3939const (
4040 emptyPointer = ``
4141 pointerSeparator = `/`
42-
43- invalidStart = `JSON pointer must be empty or start with a "` + pointerSeparator
44- notFound = `Can't find the pointer in the document`
4542)
4643
47- var jsonPointableType = reflect .TypeOf (new (JSONPointable )).Elem ()
48- var jsonSetableType = reflect .TypeOf (new (JSONSetable )).Elem ()
49-
5044// JSONPointable is an interface for structs to implement when they need to customize the
5145// json pointer process
5246type JSONPointable interface {
@@ -80,7 +74,7 @@ func (p *Pointer) parse(jsonPointerString string) error {
8074
8175 if jsonPointerString != emptyPointer {
8276 if ! strings .HasPrefix (jsonPointerString , pointerSeparator ) {
83- err = errors .New ( invalidStart )
77+ err = errors .Join ( ErrInvalidStart , ErrPointer )
8478 } else {
8579 referenceTokens := strings .Split (jsonPointerString , pointerSeparator )
8680 p .referenceTokens = append (p .referenceTokens , referenceTokens [1 :]... )
@@ -128,7 +122,7 @@ func getSingleImpl(node any, decodedToken string, nameProvider *swag.NameProvide
128122 rValue := reflect .Indirect (reflect .ValueOf (node ))
129123 kind := rValue .Kind ()
130124 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 )
132126 }
133127
134128 switch typed := node .(type ) {
@@ -146,7 +140,7 @@ func getSingleImpl(node any, decodedToken string, nameProvider *swag.NameProvide
146140 case reflect .Struct :
147141 nm , ok := nameProvider .GetGoNameForType (rValue .Type (), decodedToken )
148142 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 )
150144 }
151145 fld := rValue .FieldByName (nm )
152146 return fld .Interface (), kind , nil
@@ -158,7 +152,7 @@ func getSingleImpl(node any, decodedToken string, nameProvider *swag.NameProvide
158152 if mv .IsValid () {
159153 return mv .Interface (), kind , nil
160154 }
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 )
162156
163157 case reflect .Slice :
164158 tokenIndex , err := strconv .Atoi (decodedToken )
@@ -167,14 +161,14 @@ func getSingleImpl(node any, decodedToken string, nameProvider *swag.NameProvide
167161 }
168162 sLength := rValue .Len ()
169163 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 )
171165 }
172166
173167 elem := rValue .Index (tokenIndex )
174168 return elem .Interface (), kind , nil
175169
176170 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 )
178172 }
179173
180174}
@@ -194,7 +188,7 @@ func setSingleImpl(node, data any, decodedToken string, nameProvider *swag.NameP
194188 case reflect .Struct :
195189 nm , ok := nameProvider .GetGoNameForType (rValue .Type (), decodedToken )
196190 if ! ok {
197- return fmt .Errorf ("object has no field %q" , decodedToken )
191+ return fmt .Errorf ("object has no field %q: %w " , decodedToken , ErrPointer )
198192 }
199193 fld := rValue .FieldByName (nm )
200194 if fld .IsValid () {
@@ -214,18 +208,18 @@ func setSingleImpl(node, data any, decodedToken string, nameProvider *swag.NameP
214208 }
215209 sLength := rValue .Len ()
216210 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 )
218212 }
219213
220214 elem := rValue .Index (tokenIndex )
221215 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 )
223217 }
224218 elem .Set (reflect .ValueOf (data ))
225219 return nil
226220
227221 default :
228- return fmt .Errorf ("invalid token reference %q" , decodedToken )
222+ return fmt .Errorf ("invalid token reference %q: %w " , decodedToken , ErrPointer )
229223 }
230224
231225}
@@ -244,7 +238,6 @@ func (p *Pointer) get(node any, nameProvider *swag.NameProvider) (any, reflect.K
244238 }
245239
246240 for _ , token := range p .referenceTokens {
247-
248241 decodedToken := Unescape (token )
249242
250243 r , knd , err := getSingleImpl (node , decodedToken , nameProvider )
@@ -264,7 +257,10 @@ func (p *Pointer) set(node, data any, nameProvider *swag.NameProvider) error {
264257 knd := reflect .ValueOf (node ).Kind ()
265258
266259 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+ )
268264 }
269265
270266 if nameProvider == nil {
@@ -307,7 +303,7 @@ func (p *Pointer) set(node, data any, nameProvider *swag.NameProvider) error {
307303 case reflect .Struct :
308304 nm , ok := nameProvider .GetGoNameForType (rValue .Type (), decodedToken )
309305 if ! ok {
310- return fmt .Errorf ("object has no field %q" , decodedToken )
306+ return fmt .Errorf ("object has no field %q: %w " , decodedToken , ErrPointer )
311307 }
312308 fld := rValue .FieldByName (nm )
313309 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 {
321317 mv := rValue .MapIndex (kv )
322318
323319 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 )
325321 }
326322 if mv .CanAddr () && mv .Kind () != reflect .Interface && mv .Kind () != reflect .Map && mv .Kind () != reflect .Slice && mv .Kind () != reflect .Ptr {
327323 node = mv .Addr ().Interface ()
@@ -336,7 +332,7 @@ func (p *Pointer) set(node, data any, nameProvider *swag.NameProvider) error {
336332 }
337333 sLength := rValue .Len ()
338334 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 )
340336 }
341337
342338 elem := rValue .Index (tokenIndex )
@@ -347,7 +343,7 @@ func (p *Pointer) set(node, data any, nameProvider *swag.NameProvider) error {
347343 node = elem .Interface ()
348344
349345 default :
350- return fmt .Errorf ("invalid token reference %q" , decodedToken )
346+ return fmt .Errorf ("invalid token reference %q: %w " , decodedToken , ErrPointer )
351347 }
352348
353349 }
@@ -404,10 +400,10 @@ func (p *Pointer) Offset(document string) (int64, error) {
404400 return 0 , err
405401 }
406402 default :
407- return 0 , fmt .Errorf ("invalid token %#v" , tk )
403+ return 0 , fmt .Errorf ("invalid token %#v: %w " , tk , ErrPointer )
408404 }
409405 default :
410- return 0 , fmt .Errorf ("invalid token %#v" , tk )
406+ return 0 , fmt .Errorf ("invalid token %#v: %w " , tk , ErrPointer )
411407 }
412408 }
413409 return offset , nil
@@ -437,16 +433,16 @@ func offsetSingleObject(dec *json.Decoder, decodedToken string) (int64, error) {
437433 return offset , nil
438434 }
439435 default :
440- return 0 , fmt .Errorf ("invalid token %#v" , tk )
436+ return 0 , fmt .Errorf ("invalid token %#v: %w " , tk , ErrPointer )
441437 }
442438 }
443- return 0 , fmt .Errorf ("token reference %q not found" , decodedToken )
439+ return 0 , fmt .Errorf ("token reference %q not found: %w " , decodedToken , ErrPointer )
444440}
445441
446442func offsetSingleArray (dec * json.Decoder , decodedToken string ) (int64 , error ) {
447443 idx , err := strconv .Atoi (decodedToken )
448444 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 )
450446 }
451447 var i int
452448 for i = 0 ; i < idx && dec .More (); i ++ {
@@ -470,7 +466,7 @@ func offsetSingleArray(dec *json.Decoder, decodedToken string) (int64, error) {
470466 }
471467
472468 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 )
474470 }
475471 return dec .InputOffset (), nil
476472}
0 commit comments