@@ -114,18 +114,18 @@ func (p *Pointer) Offset(document string) (int64, error) {
114114
115115// "Constructor", parses the given string JSON pointer
116116func (p * Pointer ) parse (jsonPointerString string ) error {
117- var err error
118-
119- if jsonPointerString != emptyPointer {
120- if ! strings .HasPrefix (jsonPointerString , pointerSeparator ) {
121- err = errors .Join (ErrInvalidStart , ErrPointer )
122- } else {
123- referenceTokens := strings .Split (jsonPointerString , pointerSeparator )
124- p .referenceTokens = append (p .referenceTokens , referenceTokens [1 :]... )
125- }
117+ if jsonPointerString == emptyPointer {
118+ return nil
119+ }
120+
121+ if ! strings .HasPrefix (jsonPointerString , pointerSeparator ) {
122+ return errors .Join (ErrInvalidStart , ErrPointer )
126123 }
127124
128- return err
125+ referenceTokens := strings .Split (jsonPointerString , pointerSeparator )
126+ p .referenceTokens = append (p .referenceTokens , referenceTokens [1 :]... )
127+
128+ return nil
129129}
130130
131131func (p * Pointer ) get (node any , nameProvider * jsonname.NameProvider ) (any , reflect.Kind , error ) {
@@ -166,33 +166,36 @@ func (p *Pointer) set(node, data any, nameProvider *jsonname.NameProvider) error
166166 )
167167 }
168168
169- if nameProvider == nil {
170- nameProvider = jsonname .DefaultJSONNameProvider
171- }
169+ l := len (p .referenceTokens )
172170
173171 // full document when empty
174- if len ( p . referenceTokens ) == 0 {
172+ if l == 0 {
175173 return nil
176174 }
177175
178- lastI := len (p .referenceTokens ) - 1
179- for i , token := range p .referenceTokens {
180- isLastToken := i == lastI
181- decodedToken := Unescape (token )
176+ if nameProvider == nil {
177+ nameProvider = jsonname .DefaultJSONNameProvider
178+ }
182179
183- if isLastToken {
184- return setSingleImpl (node , data , decodedToken , nameProvider )
185- }
180+ var decodedToken string
181+ lastIndex := l - 1
186182
187- next , err := p .resolveNodeForToken (node , decodedToken , nameProvider )
188- if err != nil {
189- return err
190- }
183+ if lastIndex > 0 { // skip if we only have one token in pointer
184+ for _ , token := range p .referenceTokens [:lastIndex ] {
185+ decodedToken = Unescape (token )
186+ next , err := p .resolveNodeForToken (node , decodedToken , nameProvider )
187+ if err != nil {
188+ return err
189+ }
191190
192- node = next
191+ node = next
192+ }
193193 }
194194
195- return nil
195+ // last token
196+ decodedToken = Unescape (p .referenceTokens [lastIndex ])
197+
198+ return setSingleImpl (node , data , decodedToken , nameProvider )
196199}
197200
198201func (p * Pointer ) resolveNodeForToken (node any , decodedToken string , nameProvider * jsonname.NameProvider ) (next any , err error ) {
@@ -420,6 +423,7 @@ func offsetSingleObject(dec *json.Decoder, decodedToken string) (int64, error) {
420423 return 0 , fmt .Errorf ("invalid token %#v: %w" , tk , ErrPointer )
421424 }
422425 }
426+
423427 return 0 , fmt .Errorf ("token reference %q not found: %w" , decodedToken , ErrPointer )
424428}
425429
@@ -452,6 +456,7 @@ func offsetSingleArray(dec *json.Decoder, decodedToken string) (int64, error) {
452456 if ! dec .More () {
453457 return 0 , fmt .Errorf ("token reference %q not found: %w" , decodedToken , ErrPointer )
454458 }
459+
455460 return dec .InputOffset (), nil
456461}
457462
@@ -477,10 +482,11 @@ func drainSingle(dec *json.Decoder) error {
477482 }
478483 }
479484
480- // Consumes the ending delim
485+ // consumes the ending delim
481486 if _ , err := dec .Token (); err != nil {
482487 return err
483488 }
489+
484490 return nil
485491}
486492
0 commit comments