MCPcopy Index your code
hub / github.com/go-openapi/jsonpointer / resolveNodeForToken

Method resolveNodeForToken

pointer.go:381–443  ·  view source on GitHub ↗
(node any, decodedToken string, nameProvider NameProvider)

Source from the content-addressed store, hash-verified

379}
380
381func (p *Pointer) resolveNodeForToken(node any, decodedToken string, nameProvider NameProvider) (next any, err error) {
382 // check for nil during traversal
383 if isNil(node) {
384 return nil, fmt.Errorf("cannot traverse through nil value at %q: %w", decodedToken, ErrPointer)
385 }
386
387 pointable, ok := node.(JSONPointable)
388 if ok {
389 r, err := pointable.JSONLookup(decodedToken)
390 if err != nil {
391 return nil, err
392 }
393
394 fld := reflect.ValueOf(r)
395 if fld.CanAddr() && fld.Kind() != reflect.Interface && fld.Kind() != reflect.Map && fld.Kind() != reflect.Slice && fld.Kind() != reflect.Pointer {
396 return fld.Addr().Interface(), nil
397 }
398
399 return r, nil
400 }
401
402 rValue := reflect.Indirect(reflect.ValueOf(node))
403 kind := rValue.Kind()
404
405 switch kind {
406 case reflect.Struct:
407 nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken)
408 if !ok {
409 return nil, fmt.Errorf("object has no field %q: %w", decodedToken, ErrPointer)
410 }
411
412 return typeFromValue(rValue.FieldByName(nm)), nil
413
414 case reflect.Map:
415 kv := reflect.ValueOf(decodedToken)
416 mv := rValue.MapIndex(kv)
417
418 if !mv.IsValid() {
419 return nil, errNoKey(decodedToken)
420 }
421
422 return typeFromValue(mv), nil
423
424 case reflect.Slice:
425 if decodedToken == dashToken {
426 return nil, errDashIntermediate()
427 }
428 tokenIndex, err := strconv.Atoi(decodedToken)
429 if err != nil {
430 return nil, errors.Join(err, ErrPointer)
431 }
432
433 sLength := rValue.Len()
434 if tokenIndex < 0 || tokenIndex >= sLength {
435 return nil, errOutOfBounds(sLength, tokenIndex)
436 }
437
438 return typeFromValue(rValue.Index(tokenIndex)), nil

Callers 1

setAtMethod · 0.95

Calls 8

isNilFunction · 0.85
typeFromValueFunction · 0.85
errNoKeyFunction · 0.85
errDashIntermediateFunction · 0.85
errOutOfBoundsFunction · 0.85
errInvalidReferenceFunction · 0.85
JSONLookupMethod · 0.65
GetGoNameForTypeMethod · 0.65

Tested by

no test coverage detected