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

Function getSingleImpl

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

Source from the content-addressed store, hash-verified

482}
483
484func getSingleImpl(node any, decodedToken string, nameProvider NameProvider) (any, reflect.Kind, error) {
485 rValue := reflect.Indirect(reflect.ValueOf(node))
486 kind := rValue.Kind()
487 if isNil(node) {
488 return nil, kind, fmt.Errorf("nil value has no field %q: %w", decodedToken, ErrPointer)
489 }
490
491 switch typed := node.(type) {
492 case JSONPointable:
493 r, err := typed.JSONLookup(decodedToken)
494 if err != nil {
495 return nil, kind, err
496 }
497 return r, kind, nil
498 case *any: // case of a pointer to interface, that is not resolved by reflect.Indirect
499 return getSingleImpl(*typed, decodedToken, nameProvider)
500 }
501
502 switch kind {
503 case reflect.Struct:
504 nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken)
505 if !ok {
506 return nil, kind, fmt.Errorf("object has no field %q: %w", decodedToken, ErrPointer)
507 }
508
509 fld := rValue.FieldByName(nm)
510
511 return fld.Interface(), kind, nil
512
513 case reflect.Map:
514 kv := reflect.ValueOf(decodedToken)
515 mv := rValue.MapIndex(kv)
516
517 if mv.IsValid() {
518 return mv.Interface(), kind, nil
519 }
520
521 return nil, kind, errNoKey(decodedToken)
522
523 case reflect.Slice:
524 if decodedToken == dashToken {
525 return nil, kind, errDashOnGet()
526 }
527 tokenIndex, err := strconv.Atoi(decodedToken)
528 if err != nil {
529 return nil, kind, errors.Join(err, ErrPointer)
530 }
531 sLength := rValue.Len()
532 if tokenIndex < 0 || tokenIndex >= sLength {
533 return nil, kind, errOutOfBounds(sLength, tokenIndex)
534 }
535
536 elem := rValue.Index(tokenIndex)
537 return elem.Interface(), kind, nil
538
539 default:
540 return nil, kind, errInvalidReference(decodedToken)
541 }

Callers 2

getMethod · 0.85
GetForTokenFunction · 0.85

Calls 7

isNilFunction · 0.85
errNoKeyFunction · 0.85
errDashOnGetFunction · 0.85
errOutOfBoundsFunction · 0.85
errInvalidReferenceFunction · 0.85
JSONLookupMethod · 0.65
GetGoNameForTypeMethod · 0.65

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…