@@ -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