(node any, decodedToken string, nameProvider NameProvider)
| 482 | } |
| 483 | |
| 484 | func 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 | } |
no test coverage detected
searching dependent graphs…